Maximum Subaray(白駿10211号)
link : https://www.acmicpc.net/problem/10211
これは動的計画と暴力アルゴリズムを運用する問題である.
まず問題を見て,nの大きさの配列の中で要素の和の最大の部分数列を探す.
最初は、2つのポインタで近づき、値の和の中で最大の値を答えにしたいと思っていました.
問題ではおそらく要求の時間を満たすことができないので,別の方法を模索した.
結果は動的プログラミングを適用した.
まず、配列の値を含む配列を作成し、dp(Dynamic Programming)の値を含む配列を作成します.
for文を1から順に配列の値を比較します.
dpの値を比較します.
dp[1] = max(dp[0] + arr[1], arr[1]);
dp[2] = max(dp[1] + arr[2], arr[2]);
.
.
.
価格が-9999999999855なら.ではdp[1]には-999が含まれている.
dp[2]は、-9999+998および998の大きな値を格納する.
998の方が大きいので998をMaximum Subarayに変更
そして、dp[3]は、998+5および5の大きな値998+5=1003を記憶する.
Maximum Subarayの値は1003です.
ソース:
#include <iostream>
using namespace std;
int dp[1001] = {0, };
int arr[1001] = {0, };
int main() {
ios_base::sync_with_stdio(NULL);
cin.tie();
cout.tie();
int t, n;
cin >> t;
while (t--) {
cin >> n;
int answer = -999999999;
for (int i = 1; i <= n; i++) {
cin >> arr[i];
dp[i] = max(dp[i-1] + arr[i], arr[i]);
answer = max(answer, dp[i]);
}
cout << answer << "\n";
}
}
Reference
この問題について(Maximum Subaray(白駿10211号)), 我々は、より多くの情報をここで見つけました https://velog.io/@jiho9702/Maximum-Subarray백준-10211번テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol