hdu 1003 Max Sum
题意:输出最大子序列和。
解法:DP
ac代码:
#include<iostream> using namespace std; #define mem(x,y) memset(x,y,sizeof(x)); const int M=100099; int a[M];//存储输入的数 int sum[M];//sum[i]代表第i个为结尾的最大和 int front[M];//front[i]代表以i为结尾的最大子串和的起始位置 int main() { int t; cin>>t; int l=1; while(t--) { mem(sum,0);mem(front,0); int i,j; int n; cin>>n; for(i=1;i<=n;i++) cin>>a[i]; sum[1]=a[1];front[1]=1; int k,max; k=1;max=sum[1]; for(i=2;i<=n;i++)//精华所在,建议慢慢模拟 { if(sum[i-1]>=0) { front[i]=front[i-1]; sum[i]=sum[i-1]+a[i]; } else { sum[i]=a[i]; front[i]=i; } if(max<sum[i]) { k=i; max=sum[i]; } } printf("Case %d:\n",l++); printf("%d %d %d",max,front[k],k); if(t!=0)//亢爹,最后一组数据不需输出多一个空行 printf("\n\n"); } printf("\n"); return 0; } /* 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5 4 3 -1 -2 -2 */