#include "iostream"
#include "string"
#include "fstream"
#include "algorithm"
using namespace std;
/*
f(i, j)表示1到i的序列,划分为j段子序列和的最大值的最小值
f(i, j) = min{ max{ f(i,1)-f(k,1), f(k,j-1) }} 相当于min{ max{后半段,前半段} }
1 <= k< i
*/
const int MAX = 100;
const int INF = 100000;
int a[MAX];
int f[MAX][MAX];
int max(int a, int b)
{
return a>b ? a:b;
}
//返回总长度为n的序列的划分为m段子序列后和的最大值的最小值
int dyna(int n, int m)
{
int i, j, k;
f[0][1] = 0;
for(i=1; i<=n; i++) //f[i][1]相当于前i个数的和
f[i][1] = f[i-1][1] + a[i];
int temp, maxt;
for(i=2; i<=n; i++)
for(j=2; j<=m; j++)
{
for(k=1, temp = INF; k<i; k++)
{
maxt = max(f[i][1]-f[k][1], f[k][j-1]);
if(maxt < temp)
temp = maxt;
}
f[i][j] = temp;
}
return f[n][m];
}
int main()
{
ifstream fin("m.txt");
int n, m;
cout << "输入序列长度n=";
fin >> n; cout << n;
cout << "\n输入分割的段数m=";
fin >> m; cout << m;
cout << "\n输入各个整数:\n";
int i;
for(i=1; i<=n; i++)
{
fin >> a[i]; cout << a[i] << " ";
}
cout << endl;
cout << m << "段子序列和的最大值的最小值为:" << dyna(n, m) << endl;
fin.close();
return 0;
}
最小m段和问题
最新推荐文章于 2023-12-06 14:59:03 发布