最大部分和問題

問題概要

n個の整数が与えられます。これらの整数から何個かを選んで総和をとったときの、総和の最大値を求めるプログラムを作成する。また、何も選ばない場合の総和は0とする

アプローチ

この問題は、ダイナミックプログラミングのアプローチを用いて解く。ダイナミックプログラミングは、複雑な問題をより簡単な部分問題に分割し、それらの結果を組み合わせて全体の問題を解く手法。

ここでは、dp[i] をi番目までの数から選んだ総和の最大値とする。このとき、次の状態 dp[i + 1] を次のように更新する:dp[i + 1] = max(dp[i], dp[i] + a[i])。これは、次の数 a[i] を選ぶか選ばないかのどちらが総和を最大にするかを比較する

コード

#include <algorithm>
#include <iostream>
using namespace std;

int n;
int a[10010];
int dp[10010];

int main() {
cin >> n;
for (int i = 0; i < n; ++i)
cin >> a[i];

dp[0] = 0;
for (int i = 0; i < n; ++i) {
dp[i + 1] = max(dp[i], dp[i] + a[i]);
}

cout << dp[n] << endl;
}