Description
给定N个整数组成的序列,现在要求将序列分割为M段,每段子序列中的数在原序列中连续排列。如何分割才能使这M段子序列的和的最大值达到最小?
编程任务:给定N个整数组成的序列,编程计算该序列的最优M段分割,使M段子序列的和的最大值达到最小。
Input
输入的第一行有2个正整数N和M。正整数N是序列的长度;正整数M是分割的断数。接下来的一行中有N个整数。
Output
输出一行即:M段子序列的和的最大值的最小值。
Sample Input
1 1
10
Sample Output
10
Hint
样例二:
输入:
9 3
9 8 7 6 5 4 3 2 1
输出:
给定N个整数组成的序列,现在要求将序列分割为M段,每段子序列中的数在原序列中连续排列。如何分割才能使这M段子序列的和的最大值达到最小?
编程任务:给定N个整数组成的序列,编程计算该序列的最优M段分割,使M段子序列的和的最大值达到最小。
Input
输入的第一行有2个正整数N和M。正整数N是序列的长度;正整数M是分割的断数。接下来的一行中有N个整数。
Output
输出一行即:M段子序列的和的最大值的最小值。
Sample Input
1 1
10
Sample Output
10
Hint
样例二:
输入:
9 3
9 8 7 6 5 4 3 2 1
输出:
17
code
#include <bits/stdc++.h>
using namespace std;
#define N 200
int dp[N][N] ;//dp(i,j)表示前i个数据的j划分
int main(){
int n,m;
int a[N] ;
while (cin>>n>>m){
for(int i = 0; i<n ;++i){
cin>>a[i];
if (i==0)
dp[i][1] = a[i];
else
dp[i][1] =dp[i-1][1]+a[i];
}
dp[0][0] = 0;
//dp[1][1] = a[0] ;
for(int i = 1; i < n ;++i){
for(int j = 2; j-1 <= i&&j<=m ;++j){
dp[i][j] = 0x7fffffff;
for (int k = i-1 ; k >= 0 ; --k){
dp[i][j] = min(dp[i][j] , max(dp[i][1]-dp[k][1] ,dp[k][j-1]));
}
}
}
cout<<dp[n-1][m];
}
return 0;
}