// 动态规划-最小m段和问题.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n=0,m=0;
ifstream finput;
finput.open("input.txt");
finput>>n>>m;
vector<int> a(n+1);
int i=0;
int temp=0;
for(i=1;i<=n;++i)
{
finput>>temp;
a[i]=temp;
}
finput.close();
vector<vector<int> > b(m+1,vector<int>(n+1));
//初始化
for(i=1;i<=n;++i)
{
b[i][1]=b[i-1][1]+a[1];
}
void minsum(int,int,vector<int>,vector<vector<int> >&);
void (*p_minsum)(int,int,vector<int>,vector<vector<int> >&);
p_minsum=minsum;
p_minsum(m,n,a,b);
ofstream foutput;
foutput.open("output.txt");
foutput<<b[n][m];
foutput.close();
return 0;
}
void minsum(int m,int n,vector<int> a,vector<vector<int> >& b)
{
int max(int,int);
int i=0,j=0,k=0;
int temp_max=0;
int maxt;
for(j=2;j<=m;++i)
for(i=j;i<=n;++i)
{
for(k=1,temp_max=1000;k<i;++i)
{
maxt=max(b[i][1]-b[k][1],b[k][j-1]);
if(temp_max>maxt)temp_max=maxt;
}
b[i][j]=temp_max;
}
}
int max(int a,int b)
{
if(a<b)return b;
else return a;
}