计蒜客-最大子阵列 / NYOJ题目44-子串和

来源:互联网 发布:潍坊行知学校网站 编辑:程序博客网 时间:2024/05/18 02:41

    在一个数组中找出和最大的连续几个数。(至少包含一个数)

例如:

数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6.

输入格式

第一行输入一个不超过1000的整数n。

第二行输入n个整数A[i]。

输出格式

第一行输出一个整数,表示最大的和。

样例输入

31 1 -2

样例输出

2

逻辑真的非常重要,想清楚思路了题目才会简单



#include <cstdio>#include <iostream>using namespace std;int main(){int n;while(scanf("%d",&n)!=EOF){int a[1001],i,b[1001],sum=0;int max = -10000000;for(i=0;i<n;i++)cin>>a[i];for(i=0;i<n;i++){sum+=a[i];if(sum>=max){max=sum;}if(sum<0){sum=0;}}cout<<max<<endl;}return 0;} 


下面是动态规划的做法:

  1. #include<cstdio>    
  2. #include<cstring>    
  3. #include<algorithm>    
  4. using namespace std;    
  5. const int maxn=1000005;    
  6. int x[maxn],dp[maxn];    
  7. int maxsum(int n)    
  8. {    
  9.     memset(dp,0,sizeof(dp));    
  10.     int ans=dp[0]=x[0];    
  11.     for(int i=1;i<n;++i)    
  12.     {    
  13.         dp[i]=max(dp[i-1]+x[i],x[i]);    
  14.         ans=max(ans,dp[i]);    
  15.     }    
  16.     return ans;    
  17. }    
  18. int main()    
  19. {    
  20.     int t;    
  21.     scanf("%d",&t);    
  22.     while(t--)    
  23.     {    
  24.         int n;    
  25.         scanf("%d",&n);    
  26.         for(int i=0;i<n;++i)    
  27.         {    
  28.             scanf("%d",&x[i]);    
  29.         }    
  30.         printf("%d\n",maxsum(n));    
  31.     }    
  32.     return 0;    
  33. }    

原创粉丝点击