问题描述
给定n个整数组成的序列,现在要求将序列分割为m段,
每段子序列中的数在原序列中连续排列。如何分割才能使这m
段子序列的和的最大值达到最小?
input
9 3
987654321
output
17
#include<stdio.h>
#include<string.h>
#define n 9
#define m 3
int a[n+1]={0,9,8,7,6,5,4,3,2,1};
int s[n+1][n+1];
void main()
{
int i,j,k,temp;
s[1][1]=a[1];
for(i=2;i<=n;i++)
{
s[i][1]=s[i-1][1]+a[i];
}
for(i=2;i<=m;i++)
{
for(j=i;j<=n;j++)
{
s[j][i]=9999;
for(k=1;k<j;k++)
{
temp=(s[j][1]-s[k][1])>s[k][i-1]?(s[j][1]-s[k][1]):s[k][i-1];
s[j][i]=s[j][i]<temp?s[j][i]:temp;
}
}
}
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
printf("%d\t",s[i][j]);
printf("\n");
}
printf("%d\n",s[n][m]);
}