zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    【crontab】误删crontab及其恢复
    New Concept English there (7)
    New Concept English there (6)
    New Concept English there (5)
    New Concept English there (4)
    New Concept English there (3)
    New Concept English there (2)Typing speed exercise
    New Concept English there (1)Typing speed exercise
    New Concept English Two 34 game over
    New Concept English Two 33 94
  • 原文地址:https://www.cnblogs.com/A--Q/p/5738825.html
Copyright © 2011-2022 走看看