回复 2楼 rohalloway
谢谢你提供的思路,毫无疑问,在数据规模较小的情况下可以这样写。但是现在面临一个问题就是Mi能取到10的9次方,这个思路就不成立了。是吧?
#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; }