- 最大合計プラスプラス
1024 - HDU
トピックへのリンク:https://vjudge.net/contest/68966#problem/A
トピック:
今、私はあなたが「最大合計」Ignatius.L問題にACだと思います。勇敢ACMerであるために、我々は常に自分の問題がより困難に挑戦しています。今、あなたは、より困難な問題に直面しています。
連続した番号の所定の配列S 1、S 2、S 3 、S 4 ... SのX、... S N(1≤x≤n≤1,000,000、-32768≤Sx≤32767)。私たちは、(i、j)は= S関数sumを定義 I + ... + S jを(1≤i≤j≤n)。
今、整数mを与えられた(m> 0)で、タスクがm iとjのためにあなたを見つけることです、となるように、彼ら(I 1、J 1)+ SUM(I 2、J 2)+ SUM(I 3、J 3 )+ ... +合計(IM、 JM)、最大( または)ix≤iy≤jxix≤jy≤jxを許可していません。
しかし、私は怠け者だ、私は特別な判定モジュールを書きたくないので、あなたは、出力メートル(IX、JX)(1≤x≤mのiとj、および最大出力は合計のみにありません ) 反対。^ _ ^
入力
各試験はnは整数S 1、S 2、S 3に続く二つの整数mおよびnは、開始されます ... S nを。
ファイルの末尾に治療。
収量は、
行の最大の和を出力します。
サンプル入力
1 2 3 3 1
2 6 3 -2 -2 -1。4. 3
の出力例
。6
。8
アイデア:他のブログの二つの絵を借ります:
例えば:DP [2] [4] = MAX(MAX(-1,4,2)、2)+ NUM [4] = 7。
// // 2019年8月4日にHYによって作成されます。 // する#include <アルゴリズム> 書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include < 設定 > 書式#include <math.h>の 使用して 名前空間はstd; typedefの長い 長いLL。 const int型 MAXN = 1E6 + 10 。 int型DP [MAXN]、[MAXN] [MAXN]、numはfrontmax。 #define MAX 0x3f3f3f3f INT のmain() { int型N、M。 同時に(〜のscanf(" %d個の%のD "、&M&N)) { ため(int型 i = 1 ; iが<= N; iが++ ) のscanf(" %dの"、およびNUM [I])。 memsetの(DP、0、はsizeof (DP))。 memset(frontmax、0、はsizeof (frontmax))。 int型の温度; 以下のために(int型 I = 1 ; I <= M; iは++ ) { TEMP = MAX *( - 1 )。 以下のための(int型 J = I; J <= N; J ++ ) { DP [J] = MAX(frontmax [J- 1 ]、DP [J- 1。 ;])+ NUM [J] // 最大値DPの前に[J] Jメモリそして、frontmax J-1以前に記憶された最大値 frontmax [J- 1 ] = TEMP; TEMP = MAX(TEMP、DP [J]); // TEMP更新された値が最大である } } のprintf(" %d個の\ N- " 、TEMP); } 戻り 0 ; }