Max Sum Plus Plus HDU - 1024

    Max Sum Plus Plus     HDU - 1024

Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now you are faced with a more difficult problem. 

Given a consecutive number sequence S 1, S 2, S 3, S 4 ... S x, ... S n (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ S x ≤ 32767). We define a function sum(i, j) = S i + ... + S j (1 ≤ i ≤ j ≤ n). 

Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i 1, j 1) + sum(i 2, j 2) + sum(i 3, j 3) + ... + sum(i m, j m) maximal (i x ≤ iy ≤ j x or i x ≤ j y ≤ j x is not allowed). 

But I`m lazy, I don't want to write a special-judge module, so you don't have to output m pairs of i and j, just output the maximal summation of sum(i x, j x)(1 ≤ x ≤ m) instead. ^_^ 

Input

Each test case will begin with two integers m

Output

Output the maximal summation described above in one line. 

and n, followed by n integers S 1, S2, S 3 ... S n
Process to the end of file.

Sample Input

1 3 1 2 3

2 6 -1 4 -2 3 -2 3

Sample Output

6

8

 

 

       

  

Hint

Huge input, scanf and dynamic programming is recommended.

 

分析:d[j]为遍历到当前数字时,前j-1个数的i段区间和的最大值加上a[j],d[j]是动态的,可取可不取;

p[j]为记录前j个数的i段区间和的最大值;

 

 

j

1

2

3

4

5

6

i

 

-1

4

-2

3

-2

3

1

d

-1

4

2

5

3

6

1

p

-1

4

4

5

5

 

2

d

-1

3

2

7

5

8

2

p

-1e9

3

2

7

7

 

代码中p[n]没有记录,直接放在了ans中。

代码:

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<math.h>

using namespace std;

const int Max=1e6+5;

int p[Max],a[Max],d[Max];

int main()

{

     int m,n,ans;

     while(scanf("%d%d",&m,&n)!=EOF)

     {

          memset(p,0,sizeof(p));

          memset(d,0,sizeof(d));

          for(int i=1;i<=n;i++)

          scanf("%d",&a[i]);

          for(int i=1;i<=m;i++)

{

               ans=-1e9;

               for(int j=i;j<=n;j++)

               {

                    d[j]=max(d[j-1],p[j-1])+a[j];

                    p[j-1]=ans;

                    ans=max(ans,d[j]);

               }

          }

          printf("%d\n",ans);

     }

}

posted @ 2019-03-23 13:06  Davenport  阅读(223)  评论(0)    收藏  举报