首页 > 代码库 > dp/hdu 1003 Max Sum
dp/hdu 1003 Max Sum
题目
给出一列数,求出最大的子段和,并输出起始点和结束点
分析
设d[i]为末尾数是i的最大和,我们可以得到
d[i-1]>=0时,d[i]=d[i-1]+a[i];
d[i-1]<=0时,d[i]=a[i];
i从1到n都算过一遍后,找出最大的d[i],则此时的i为结束点。再从结束点倒着向前加,直到找到与答案相同的位置,记为起始点
Accepted Code
1 /* 2 PROBLEM:hdu1003 3 AUTHER:NicoleLam 4 MEMO:dp 5 */ 6 #include<cstdio> 7 const int MAXN=100010; 8 9 int a[MAXN],d[MAXN];10 int main()11 {12 int tot;13 scanf("%d",&tot);14 for (int t=1;t<=tot;t++)15 {16 int n;17 scanf("%d",&n);18 for (int i=0;i<MAXN;i++){a[i]=0;d[i]=0;}19 for (int i=1;i<=n;i++) scanf("%d",&a[i]);20 d[1]=a[1];21 for (int i=2;i<=n;i++)22 {23 if (d[i-1]>=0) d[i]=d[i-1]+a[i];24 else d[i]=a[i];25 }26 int ans=d[1],ed=1;27 for (int i=2;i<=n;i++)28 if (ans<d[i])29 {30 ans=d[i];31 ed=i;32 }33 int temp=0,st=ed;34 for (int i=ed;i>0;i--)35 {36 temp+=a[i];37 if (temp==ans) st=i;38 }39 printf("Case %d:\n",t);40 printf("%d %d %d\n",ans,st,ed);41 if (t!=tot) printf("\n");42 }43 return 0;44 }
dp/hdu 1003 Max Sum
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。