POJ2479【线性DP】

来源:互联网 发布:unity3d 怎么加模型 编辑:程序博客网 时间:2024/05/21 14:58

看完题还懵逼了。。。


题意:

给一个序列,求连续两个序列的最大值。

思路:

正着做一次一段连续序列的最大值。
反着做一次一段连续序列的最大值。
然后对每个位置可得前面最大+后面最大,判断枚举一下就好了。

//#include <bits/stdc++.h>#include<iostream>#include<vector>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;typedef pair<int,int> PII;typedef long long LL;//#pragma comment(linker, "/STACK:102400000,102400000")const int INF=0x3f3f3f3f;const int N=5e4+10;int n;int a[N];int temp1[N],temp2[N];void solve1(){    int cur = a[1];    int ans = a[1];    temp1[1]=ans;    for(int i=2;i<=n;i++){        if(cur > 0)            cur += a[i];        else cur = a[i];        if(cur > ans) ans = cur;        temp1[i] = ans;    }}void solve2(){    int cur = a[n];    int ans = a[n];    temp2[n]=ans;    for(int i=n-1;i>=1;i--){        if(cur>=0)            cur += a[i];        else cur = a[i];        if(cur > ans) ans = cur;        temp2[i] = ans;    }}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d",&n);        for(int i=1;i<=n;i++) scanf("%d",&a[i]);        memset(temp1,0,sizeof(temp1));        memset(temp2,0,sizeof(temp2));        solve1();        solve2();        int ans=-INF;        for(int i=1;i<n;i++) ans = max(temp1[i]+temp2[i+1],ans);        printf("%d\n",ans);    }    return 0;}
原创粉丝点击