最大连续子序列(HDU - 1231)

来源:互联网 发布:淘宝上怎么看卖家地址 编辑:程序博客网 时间:2024/05/16 04:54

题意:最大连续子序列裸


思路很简单,其实就是枚举,对于第i个数,考虑dp[i-1]+num[i]和num[i]的大小,即,是跟着前面一起玩呢还是另起一家->dp[i]=max(dp[i-1]+num[i],dp[i]),每次都尝试更新答案,即可求得最大值。

if(dp[i-1]>0){    dp[i]=dp[i-1]+num[i];}else{dp[i]=num[i];left=num[i];}


这道题目还有一个要求就是要求出序列的头和尾的位置。在计算过程中记录,答案的的时候把头尾一起更新掉即可。具体见代码:


#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<string>#include<cmath>#include<cstdlib>#include<vector>#define INF 100000000#define MAXNUM 10007#define pi 3.1415926using namespace std;int num[MAXNUM];int dp[MAXNUM];int main(){int k;while(scanf("%d",&k)!=EOF&&k!=0){int flag=0;for(int i=0;i<k;i++){scanf("%d",&num[i]);if(num[i]>=0) flag=1;}if(flag){int left=num[0];int fleft=num[0];int right=num[k-1];int fright=num[k-1];dp[0]=num[0];int ans=dp[0];    for(int i=1;i<k;i++){    if(dp[i-1]>0){    dp[i]=dp[i-1]+num[i];}else{dp[i]=num[i];left=num[i];}    if(dp[i]>ans){    ans=dp[i];    fleft=left;    fright=num[i];}    }    printf("%d %d %d\n",ans,fleft,fright);    }else printf("0 %d %d\n",num[0],num[k-1]);memset(dp,0,sizeof(dp));}}


0 0