hdu1003 Max Sum

来源:互联网 发布:莫比乌斯环戒指知乎 编辑:程序博客网 时间:2024/05/19 18:47

动规,用dp[i]数组记录到i为止的最大的字段和,v[]数组存这段字段和下标开始的位置,index保存下标结束的位置


状态转移方程:dp[i]=max(dp[i-1]+dp[i],dp[i]);   (i>1)

                         dp[i]=dp[i];(i=1)

记住max()在dp[i-1]+dp[i]==dp[i]时返回dp[i-1]+dp[i]


我是用条件判断做的

#include<stdio.h>int main(){int count=1,i,n,m,index;int dp[100005],v[100005];scanf("%d",&n);while(n--){scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d",&dp[i]);v[i]=i;}for(i=2;i<=m;i++){if(dp[i-1]+dp[i]>=dp[i]){dp[i]=dp[i-1]+dp[i];v[i]=v[i-1];}}int max=dp[1];for(i=1;i<=m;i++){if(dp[i]>=max){max=dp[i];index=i;}}if(count!=1)printf("\n");printf("Case %d:\n%d %d %d\n",count++,max,v[index],index);}return 0;}


0 0
原创粉丝点击