1912年
まず入力した数字を最初から1つずつ進めていきます.
しかし、これまで以上に増やしたい数は多い.
もっと大きいと.
今までやってきたことをすべて放棄する.
加算する数から、もう1つずつ加算すれば、問題を解決できます.
説明が難しすぎて、例を使うのは簡単です.
問題テストケース1
10
10 -4 3 1 5 6 -35 12 21 -1
累積後の値はdp[size]、最大結果値はresultである.
プラス10.dp[0] = 10, result = 10
dp[0]プラス-4の値>-4なので=>を加算dp[1] = 6, result = 10
dp[1]プラス3の値>3なので=>を加算dp[2] = 9, result = 10
...
(...に-35を加える)=>dp[6]=-14,result=10
...
dp[6]に12の値<12を加え、dpを12に更新する.
=> dp[7] = 12, result = 12
dp[7]プラス21の値>21なのでプラス21.
=> dp[8] =33, result = 33
dp[8]プラス-1の値>-1なのでプラス-1.
=> dp[9] = 32, result = 33
したがって、正解はresult=33です.
ソースコード
非常に簡単に実現できます.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> sequence(n);
vector<int> dp(n);
for (int i = 0; i < n; i++)
cin >> sequence[i];
int result = sequence[0];
dp[0] = sequence[0];
for (int i = 1; i < n; i++) {
dp[i] = max(dp[i - 1] + sequence[i], sequence[i]);
result = max(result, dp[i]);
}
cout << result;
}
Reference
この問題について(1912年), 我々は、より多くの情報をここで見つけました https://velog.io/@bty5596/1912-연속합テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol