首页 > 代码库 > HDU_1003Max Sum 简单动归
HDU_1003Max Sum 简单动归
以前做过这道题目,那是还不懂状态方程。乱搞一气:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 const int maxn=5000+10; 5 int a[maxn]; 6 int main() 7 { 8 int T; 9 scanf("%d",&T);10 for(int i=1;i<=T;i++)11 {12 int n;13 scanf("%d",&n);14 for(int j=0;j<n;j++)15 scanf("%d",&a[j]);16 int maxd=a[0];17 int temp=a[0];18 int left=0;19 int right=0;20 int x=0;21 for(int j=1;j<n;j++)22 {23 if(temp+a[j]<a[j])24 {25 // left=right=j;//刚开始这里错了,不能直接转过去,先存到x中26 temp=a[j];27 x=j;28 }29 else30 temp+=a[j];31 if(temp>maxd)32 {33 maxd=temp;34 left=x;35 right=j;36 }37 }38 printf("Case %d:\n",i);39 printf("%d %d %d\n",maxd,left+1,right+1);40 if(i!=T);41 printf("\n");42 }43 }
后来的做法:
1 //状态方程:dp[j]=max(dp[j-1]+a[j],a[j]); 2 //dp[0]=a[0]; 3 #include <iostream> 4 using namespace std; 5 int dp[100001]; 6 int a[100001]; 7 int re_start[100001]; 8 int main() 9 {10 int i,t;11 cin>>t;12 for(i=1;i<=t;i++)13 {14 int n,j;15 cin>>n;16 for(j=0;j<n;j++)17 cin>>a[j];18 dp[0]=a[0];19 re_start[0]=0;20 for(j=1;j<n;j++)21 {22 if(dp[j-1]+a[j]>=a[j])23 {24 dp[j]=dp[j-1]+a[j];25 re_start[j]=re_start[j-1];26 }27 else28 {29 dp[j]=a[j];30 re_start[j]=j;31 }32 }33 int d=dp[0];34 for(j=0;j<n;j++)35 if(dp[j]>d)36 d=dp[j];37 printf("Case %d:\n",i);38 for(j=0;j<n;j++)39 if(d==dp[j])40 {41 printf("%d %d %d\n",d,re_start[j]+1,j+1);42 break;43 }44 if(i!=t)45 printf("\n"); 46 }47 return 0;48 }
HDU_1003Max Sum 简单动归
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。