これは、状態がDP[i][j]
と定義されている動的プログラミング手法を使用して解決できます。ここで、i
は1日の終了インデックスを指し、j
はこれまでの日のカウントを保持します。次の状態に移動し、現在の移動に対応する1日の最大合計を取ってから、それを全体の最小値と比較することができます。
C++で再帰的な動的プログラミングソリューションを作成しましたが、状態遷移がどのように機能しているかを理解するのは難しいかもしれません。ソリューションIdeoneへ
#include <iostream>
#define INF 1000000000
using namespace std;
int n, m, dist[100] = {1,5,2,6,8,3,2}, dp[1000][1000];
int solve(int index, int count){
if(index == n){
if(count == m) return 0;
else return INF;
}
if(dp[index][count] != -1) return dp[index][count];
int sum = 0, ans = INF;
for(int i = index;i < n;i++){
sum += dist[i];
int val = max(sum, solve(i+1, count+1));
ans = min(ans, val);
}
return dp[index][count] = ans;
}
int main() {
// your code goes here
n = 7, m = 3;
for(int i = 0;i < 1000;i++) for(int j = 0;j < 1000;j++) dp[i][j] = -1;
cout << solve(0, 0) << endl;
return 0;
}
リンク:https://ideone.com/glHsgF
これは動的プログラミングの問題で、 'O(n * m)'で解くことができます – uSeemSurprised
これは大学の課題か他のアンケートで尋ねられる質問ですか? – Ali786
さて、この問題はよく定義されていません...例えば、より良い解決策は、[[1,5,2,6,8,3,2]、[]、[] 'いずれにしても、単純なソリューションでは、binpackingを使用し、ボリュームパラメータに対してバイナリ検索を使用することができます。 – Bakuriu