poj 2479

来源:互联网 发布:查看获得mac地址 编辑:程序博客网 时间:2024/06/05 03:26

要求一串中两段连续的最大和。思路是:现在读取每个数字的时候进行一次dp,dp[i]=max{dp[i-1]+a[i],a[i]},即i(包括i)向左的连续的最大和值。

然后从右向左(最后一个开始)找连续最大的和值,到i时,与dp[i-1]的和看是否为最大。

  /*  poj 2479 dp  */#include <stdio.h>#include <cstring>#include <iostream>using namespace std;#define max 50099int a[max];int d[max];int main(int argc, char const *argv[]){// freopen("input","r",stdin);int n;memset(d,false,sizeof(d));scanf("%d",&n);while(n--){int x;scanf("%d",&x);for(int i=1;i<=x;i++){scanf("%d",&a[i]);if(d[i-1]>0)d[i]=d[i-1]+a[i];elsed[i]=a[i];}int sum=0,m=-1000000,s=-10000000;for (int i = x; i >1; --i){sum+=a[i];if(sum>m)m=sum;if(d[i-1]+m>s)s=d[i-1]+m;if(sum<0)sum=0;}cout<<s<<endl;}return 0;}


0 0
原创粉丝点击