最小m段和(DP)

来源:互联网 发布:abb robotware软件配置 编辑:程序博客网 时间:2024/06/05 06:26


第四届程序设计大赛 最小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 39 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;}


0 0
原创粉丝点击