第四届程序设计大赛 最小m段和
Time Limit:1000MS Memory Limit:65536K
Total Submit:48 Accepted:17
Description
给定 n 个整数组成的序列,现在要求将序列分割为 m 段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小?
编程计算该序列的最优m 段分割,使m 段子序列的和的最大值达到最小。
Input
输入数据的第1行中有 2个正整数n和 m(0 <= m <= n <= 200)。正整数 n是序列的长度;正整数m是分割的断数。 接下来的一行中有n个整数 (0 <= 整数 <= 1000)。
Output
输出计算出的 m段子序列的和的最大值的最小值。
Sample Input
9 3
9 8 7 6 5 4 3 2 1
Sample Output
17
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int a[222],f[222][222];
int main()
{
int n,m,i,j,k,maxt,tmp;
while(scanf("%d%d",&n,&m)==2)
{
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
f[i][1]=f[i-1][1]+a[i];
}
for(i=2;i<=m;i++)
{
for(j=i;j<=n;j++)
{
tmp=9999999;
for(k=i;k<j;k++)
{
maxt=max(f[k][i-1],f[j][1]-f[k][1]);
if(tmp>maxt)
tmp=maxt;
}
f[j][i]=tmp;
}
}
printf("%d\n",f[n][m]);
}
return 0;
}