hdu 1003 Max Sum(动态规划)
解题思路:
本题在给定的集合中找到最大的子集合【子集合:集合的元素的总和,是所有子集合中的最大解。】
结果输出: 最大的子集合的所有元素的和,子集合在集合中的范围区间.
依次对元素相加,存到一个 sum 中,同时ans=sum;定义左右边界 left,right;临时左边界ll=1;
如果sum>ans,则ans=sum; 左边界 left=tem; right=i+1;
如果sum<0,则sum=0; tem=i+2;
Ac code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int t,a,sum,ans,l,r,x,ll; 6 scanf("%d",&t); 7 for(int k=1; k<=t; k++) 8 { 9 sum=0;ans=-10000;ll=1; 10 scanf("%d",&x); 11 for(int i=0; i<x; i++) 12 { 13 scanf("%d",&a);sum+=a; 14 if(sum>ans) 15 {ans=sum;l=ll;r=i+1;} 16 if(sum<0) 17 {sum=0;ll=i+2;} 18 } 19 printf("Case %d:\n%d %d %d\n",k,ans,l,r); 20 if(k!=t)printf("\n"); 21 } 22 return 0; 23 }
简单DP: 2017.03.29
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std; 5 #define N 100005 6 int dp[N]; 7 int a[N]; 8 int main() 9 { 10 int t; 11 while(scanf("%d",&t)!=EOF) 12 { 13 int c=1,T=t; 14 while(t--) 15 { 16 memset(dp,0,N); 17 int n; 18 scanf("%d",&n); 19 for(int i=1; i<=n; i++) 20 scanf("%d",&a[i]); 21 dp[1]=a[1]; 22 for(int j=2; j<=n; j++) 23 dp[j]=max(dp[j-1]+a[j],a[j]); 24 25 int mx=-999999999; 26 int st=0,en=0; 27 for(int i=1; i<=n; i++) 28 if(mx<dp[i]) 29 { 30 mx=dp[i]; 31 en=i; 32 } 33 st=en; 34 int sum=0; 35 for(int i=en; i>=1; i--) 36 { 37 sum+=a[i]; 38 if(sum==mx) 39 st=i; 40 } 41 printf("Case %d:\n%d %d %d\n",c,mx,st,en); 42 if(c!=T)printf("\n"); 43 c+=1; 44 } 45 } 46 return 0; 47 }