POJ-2479

DP基础题

属于DP求最大字串和的变形

d1[x]代表在a[0,x]中,包含a[x](即a[x‘,x])的最优解——其实就是标准DP求最大字串是用的数组

c1[x]代表在a[0,x]中,可以不包含a[x]的最优解。

d2, c2是反向的,道理相同。

转移方程

  d1[i] = (d1[i-1] < 0) ? (a[i]) : (d1[i-1] + a[i]);

  c1[i] = maxx(c1[i-1], d1[i]);

  d2, c2类似

最终通过c1, c2计算出结果即可

#include<cstdio>

#define MAXN 50010
#define maxx(a,b) ((a)>(b))?(a):(b)

int a[MAXN];
int d1[MAXN], c1[MAXN];
int d2[MAXN], c2[MAXN];

int main(void)
{
  //std::ios::sync_with_stdio(false);
  int T, n;
  int ans;
  scanf("%d", &T);//cin>>T;
  for(int t = 0; t < T; t++){
    scanf("%d", &n);//cin>>n;
    for(int i = 0; i < n; ++i) scanf("%d", &a[i]);//cin>>a[i];
    d1[0] = a[0];
    c1[0] = a[0];
    for(int i = 1; i < n; ++i){
      d1[i] = (d1[i-1] < 0) ? (a[i]) : (d1[i-1] + a[i]);
      c1[i] = maxx(c1[i-1], d1[i]);
    }
    d2[n-1] = a[n-1];
    c2[n-1] = a[n-1];
    for(int i = n-2; i >= 0 ; --i){
      d2[i] = (d2[i+1] < 0) ? (a[i]) : (d2[i+1] + a[i]);
      c2[i] = maxx(c2[i+1], d2[i]);
    }
    ans = c1[0] + c2[1];
    for(int i = 2; i < n; ++i)
      ans = maxx(ans, c1[i-1]+c2[i]);
    printf("%d\n", ans);//cout<<ans<<endl;
    /*for(int i = 0; i < n; ++i)
      printf("c1[%d] = %d\n", i, c1[i]);
    for(int i = 0; i < n; ++i)
      printf("c2[%d] = %d\n", i, c2[i]);*/
  }
  return 0;
}

这一题虽然很弱,但收获不小。

1.从今以后,尽量避免iostream这个坑,TLE非常令人感动,即使加上了看不懂的std::ios::sync_with_stdio(false)也无济于事。

2.通过本题,学会了白书上的批处理标程,虽说最后没其什么作用,但好歹是会了。

3.终于不TLE了居然还WA,一开始我是崩溃的,最终发现一开始我就猜到的全是负的那种数据真的是存在的,但是我明明考虑到了啊,好吧,一小时以后我终于发现,我的思路没有问题,只是中间一个c2打成c1了,看来这个起名的方式以后得好好考虑考虑。

时间: 2024-08-27 15:58:02

POJ-2479的相关文章

[ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33363   Accepted: 10330 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

POJ 2479 Maximum sum

http://poj.org/problem?id=2479 题意: 给出一个整数串,求连续子串1和连续子串2,不相交并且串1加串2的和最大. 思路: 其实就是求最大连续和,题意要求就是求两段最大连续和.我们可以从左边和右边分别求最大连续和,代码中的dp_l[i]就是1~i的最大连续和,dp_r[i]则是i~n的最大连续和. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<

51nod 1052最大M子段和 &amp; poj 2479最大两子段和

最大子段和经典问题的扩展. 题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1052 N个整数组成的序列a[1],a[2],a[3],…,a[n],将这N个数划分为互不相交的M个子段,并且这M个子段的和是最大的.如果M >= N个数中正数的个数,那么输出所有正数的和. 例如:-2 11 -4 13 -5 6 -2,分为2段,11 -4 13一段,6一段,和为26. Input 第1行:2个数N和M,中间用空格分

POJ 2479 不相交最大子段和

题目意思还是很好理解的,在一个数列中,找出不相交的两个子串使得其和最大. 解题思路: 对于每个i来说,求出[0 ~ i - 1] 的最大子段和以及[i ~ n - 1]的最大子段和,在加起来,求最大的一个就行了. [0 ~ i - 1]的最大子段和从左向右扫描,[i ~ n - 1] 的最大子段和从右向左扫描即可.时间复杂度为 O(n) source code: //#pragma comment(linker, "/STACK:16777216") //for c++ Compile

Maximum sum(poj 2479)

题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和 /* 看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和, 然后枚举断点. 第一次提交不小心折在数组最小值的赋值上…… */ #include<cstdio> #include<iostream> #include<cstring> #define M 50010 #define INF 1000000000 using namespace std; int a[M]

poj 2479 Maximum sum(递推)

?? 题意:给定n个数,求两段连续不重叠子段的最大和. 思路非常easy.把原串划为两段.求两段的连续最大子串和之和,这里要先预处理一下,用lmax数组表示1到i的最大连续子串和,用rmax数组表示n到i的最大连续子串和,这样将时间复杂度降为O(n). #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include&l

poj 2479 dp求分段最大和

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38079   Accepted: 11904 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

[poj 2479] Maximum sum -- 转载

转自 CSND 想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                                      转载请注明出处:http://blog.csdn.net/wangjian8006 题目大意: 对于连续的整数和的串s1和s2,s1与s2不相交,使得s1+s2最大 解题方法: DP.  lt[i]代表以第i个元素结尾的串最大值  rt[i]代表以第i个元素开头的串的最大

POJ 2479 Maximum sum ( DP )

题目大意: 对整数串S,求其两个不相交的子串s1.s2,使得s1+s2的值最大. 方法:DP, lt[i]代表以第i个元素结尾的串最大值 rt[i]代表以第i个元素开头的串的最大值 那么设置一个rtm[i]代表取后i个元素之中最大连续子串的和 很显然,lt[i]=max(a[i],lt[i-1]+a[i]); rt[i]=max(a[i],rt[i+1]+a[i]); rtm[i]=max(rtm[i+1],rt[i]); #include <iostream> #include <cs

poj 2479 max sum

Maximum sumTime Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u SubmitStatus Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists