问题描述:
给定N个整数组成的序列,现在要求将序列分割为M段,每段子序列中的数在原序列中连续排列。如何分割才能使这M段子序列的和的最大值达到最小?
编程任务:
给定N个整数组成的序列,编程计算该序列的最优M段分割,使M段子序列的和的最大值达到最小。
Input
输入的第一行有2个正整数N和M。正整数N是序列的长度;正整数M是分割的断数。接下来的一行中有N个整数。
Output
输出一行即:M段子序列的和的最大值的最小值。
Sample Input
1 1
10
Sample Output
10
分析:
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int a[100],f[100][100];
int max(int a,int b)
{
return a>b?a:b;
}
int solve(int n,int m) {
int i,j,k;
memset(f,0,sizeof(f));
for(i=1;i<=n;++i)
f[i][1]=f[i-1][1]+a[i];
int maxt,tmp;
for(i=2;i<=m;++i)
for(j=i;j<=n;++j){
tmp=1e9;
for(k=i;k<j;++k){
maxt=max(f[j][1]-f[k][1],f[k][i-1]);
if(tmp>maxt)
tmp=maxt;
}
f[j][i]=tmp;
}
return f[n][m];
}
int main()
{
cout<<"请输入n和m的值:"<<endl;
cin>>n>>m;
cout<<"请依次输入n个数:"<<endl;
for(int i=1;i<=n;++i)
cin>>a[i];
cout<<n<<"个数组成的序列分成"<<m<<"段子序列的和的最大值的最小值是"<<solve(n,m)<<endl;
return 0;
}
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
int a[100],f[100][100];
int max(int a,int b)
{
return a>b?a:b;
}
int solve(int n,int m) {
int i,j,k;
memset(f,0,sizeof(f));
for(i=1;i<=n;++i)
f[i][1]=f[i-1][1]+a[i];
int maxt,tmp;
for(i=2;i<=m;++i)
for(j=i;j<=n;++j){
tmp=1e9;
for(k=i;k<j;++k){
maxt=max(f[j][1]-f[k][1],f[k][i-1]);
if(tmp>maxt)
tmp=maxt;
}
f[j][i]=tmp;
}
return f[n][m];
}
int main()
{
cout<<"请输入n和m的值:"<<endl;
cin>>n>>m;
cout<<"请依次输入n个数:"<<endl;
for(int i=1;i<=n;++i)
cin>>a[i];
cout<<n<<"个数组成的序列分成"<<m<<"段子序列的和的最大值的最小值是"<<solve(n,m)<<endl;
return 0;
}