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:
%d %d %d
",k,ans,l,r);
20         if(k!=t)printf("
");
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:
%d %d %d
",c,mx,st,en);
42             if(c!=T)printf("
");
43             c+=1;
44         }
45     }
46     return 0;
47 }
原文地址:https://www.cnblogs.com/A--Q/p/5738825.html