回复 2楼 rohalloway
谢谢你提供的思路,毫无疑问,在数据规模较小的情况下可以这样写。
但是现在面临一个问题就是Mi能取到10的9次方,这个思路就不成立了。是吧?
2018-11-22 18:56

2018-11-22 21:47
。
2018-11-22 22:42
给你点个赞。我还没有细看你的代码,我今早也想了个方案,刚刚做出来提交过了,哈哈。。

程序代码:#include <cstdio>
#include <algorithm>
#define MAXN 100000
using namespace std;
struct Data
{
long long bricks;//存放数据(每一列砖的高度)
int index;//存放数组下标
};
struct Rule//按砖的高度,从小到大排序
{
bool operator()(const Data &s1, const Data &s2)
{
if (s1.bricks < s2.bricks)
return true;
else
return false;
}
};
Data a[MAXN+10];
long long dp[MAXN+10];
int main(void)
{
int n;
long long i;
scanf("%d", &n);//墙的长度
for (i=1; i<=n; ++i)
{
scanf("%lld", &a[i].bricks);//输入每一类砖的高度
dp[i] = a[i].bricks;
a[i].index = i;//保存下标
}
//dp[]初始化
for (i=1; i<=n/2; ++i)
dp[i] = min(dp[i], i);
for (i=n; i>n/2; --i)
dp[i] = min(dp[i], n+1-i);
//从小到大排序
sort(a+1, a+n+1, Rule());
int Max=0;
for (i=1; i<=n; ++i)
{
//更新左边的dp[]
if (dp[a[i].index]+1<dp[a[i].index-1])
dp[a[i].index-1] = dp[a[i].index]+1;
//更新右边的dp[]
if (dp[a[i].index]+1<dp[a[i].index+1])
dp[a[i].index+1] = dp[a[i].index]+1;
}
//找出dp[]中最大的一个
for (i=1; i<=n; ++i)
{
if (dp[i]>Max)
Max = dp[i];
}
printf("%d", Max);//输出
return 0;
}
2018-11-23 13:10

[此贴子已经被作者于2018-11-23 19:49编辑过]
2018-11-23 19:45
2018-11-24 19:46