dp 最大字段和 问题
最大字段和 最暴力的算法就是
int s = 0;//起始位置 int e = 0; //结束位置 int max = 0; for(int i = 1; i <= n; ++i) { for(int j = i; j <= n;++j) { int sum = 0; for(int k = i; k <=j; ++k) sum += a[k]; if(sum > max) { s = i; e = j; max = sum; } } }显然 时间复杂度O(n^3) 可想而知 必然超时 ,
因此优化操作 用一个sum 直接加 这样复杂度变成O(n^2) 但是 对于数据来说 仍会超时
for(int i = 1; i <= n; ++i) { int sum = 0; for(int j = i; j <= n;++j) { sum += a[j]; if(sum > max) { start = i; end = j; max = sum; } } }
这是我们用dp 思想来 dp[i]=max(dp[i],dp[i]+a[i]); 这样 复杂度就是O(n)74
77
for(int i = 1; i <= n; ++i) { if(b[i-1]>0) { b[i] = b[i-1]+a[i]; }else{ b[i] = a[i]; } if(b[i]>max) max = b[i]; }因此最大字段和就是max
但是 这样 我们却没有记录起始点和终点 我们又可以这样操作
s=e=temp=1; for(i=1;i<=n;i++) { scanf("%d",&x); sum+=x; if(sum>max) { max=sum; s=temp; e=i; } if(sum<0) { sum=0; temp=i+1; } }
岂曰无衣?与子同袍。王于兴师,修我戈矛。与子同仇!
岂曰无衣?与子同泽。王于兴师,修我矛戟。与子偕作!
岂曰无衣?与子同裳。王于兴师,修我甲兵。与子偕行!