hdu1003---Max Sum
tips:
1.最大子序列和,最大的那个子序列肯定是结束位置的
2.关键是子序列开始的位置---什么时候要重新改变起点
3.重叠子问题和递推
//1 2 3 4
//1
//2 12
//23 123----观察重叠子问题和递推
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//动态规划处理最优化问题 //将原问题分解成子问题,综合子问题的解得到最优解 //重叠子问题,最优子结构(子问题的解也是最优的)无后效性 //自底向上解决问题 #include<cstdio> #include<algorithm> using namespace std; const int M=100010; int t; int n; int a[M]; int dp[M]; int main(){ while(scanf("%d",&t)!=EOF){ int cas=1; int flag=1; while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); } dp[1]=a[1]; int L=1; int R=1; int start=1; int over=1; int ans=dp[1]; for(int i=2;i<=n;i++){ if(dp[i-1]+a[i]<a[i]){ dp[i]=a[i]; L=i; } else{ dp[i]=dp[i-1]+a[i]; } if(dp[i] > ans){//当dp[x]<0时,改变记录的左端点,当dp[]往后积累到大于之前的最大值时,更新左端点和右端点 ans=dp[i]; start=L; over=i; } } printf("Case %d:\n",cas++); printf("%d %d %d\n",ans,start,over); if(t) printf("\n"); } } return 0; }