# Max Sum Plus Plus

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6721 Accepted Submission(s): 2248

Problem Description

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 S1, S2, S3, S4 ... Sx, ... Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767). We define a function sum(i, j) = Si + ... + Sj (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(i1, j1) + sum(i2, j2) + sum(i3, j3) + ... + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx 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(ix, jx)(1 ≤ x ≤ m) instead. ^_^

Input

Each test case will begin with two integers m and n, followed by n integers S1, S2, S3 ... Sn.
Process to the end of file.

Output

Output the maximal summation described above in one line.

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.

Author

JGShining（极光炫影）

用两个数组pre[]和now[]来存储前一个状态的值 ， now[]存储当前状态的值；

` 1 #include<stdio.h> 2 #include<string.h> 3 #define MAX 1000050  4 int pre[MAX] , now[MAX] , num[MAX] ; // pre[] 存储前一个状态的最大值 ， now[]存储当前状态的值  5 int max_sum ; 6 int max ( int a , int b ) 7 { 8     return a > b ? a : b ; 9 }10 int main ()11 {12     int n , m ;13     while ( scanf("%d%d" , &m , &n) != EOF )14     {15           for ( int i = 1 ; i <= n ; ++ i )16           {17               scanf ( "%d" , num + i ) ;18           }19           memset( pre , 0 , sizeof (pre) ) ;20           memset( now , 0 , sizeof (pre) ) ;21           for ( int i = 1 ; i <= m ; ++ i )  22           {23               max_sum = -9999999 ;24               for ( int j = i ; j <= n ; ++ j )25               {26                   now[j] = max ( now[j-1] + num[j] , pre[j-1] + num[j] ) ;27                   pre[j-1] = max_sum ;28                   if ( max_sum < now[j] ) 29                        max_sum = now[j] ;30               }31           }32           printf ( "%d\n" , max_sum ) ; 33     }34     return  0 ;35 }`

• 相关阅读:
软件工程实验二—结构化分析与设计
软件工程实验一 软件开发文档与工具的安装与使用
个人作业三-ATM管理系统
软件工程个人作业二—举例分析流程图与活动图的区别与联系
软工个人作业—四则运算
2020软件工程作业02
自我介绍
2019春总结作业
2019春第四次课程设计实验报告
2019春第三次课程设计实验报告
• 原文地址：https://www.cnblogs.com/jbelial/p/2126540.html