问题引入
代码实现
#include<iostream>
using namespace std;
#define N 1000
#define INF 99999
int stones[N];
int Min[N][N],Max[N][N];
int sum[N];
void highway(int n){
for(int i=1;i<=n;i++){
Min[i][i]=0;
Max[i][i]=0;
}
sum[0]=0;
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+stones[i];
}
for(int step=2;step<=n;step++){
for(int i=1;i<=n-step+1;i++){
int j=i+step-1;
Min[i][j]=INF;
Max[i][j]=-1;
int temp=sum[j]-sum[i-1];
for(int k=i;k<j;k++){
if(Min[i][j]>Min[i][k]+Min[k+1][j]+temp){
Min[i][j]=Min[i][k]+Min[k+1][j]+temp;
}
if(Max[i][j]<Max[i][k]+Max[k+1][j]+temp){
Max[i][j]=Max[i][k]+Max[k+1][j]+temp;
}
}
}
}
}
void playground(int n){
for(int i=1;i<=n-1;i++){
stones[n+i]=stones[i];
}
n=2*n-1;
highway(n);
n=(n+1)/2;
int temp_min=Min[1][n];
int temp_max=Max[1][n];
for(int i=2;i<=n;i++){
if(Min[i][n+i-1]<temp_min){
temp_min=Min[i][n+i-1];
}
if(Max[i][n+i-1]>temp_max){
temp_max=Max[i][n+i-1];
}
}
cout<<"操场玩法\n";
cout<<"Min "<<temp_min<<endl;
cout<<"Max "<<temp_max<<endl;
}
int main(int argc,char**argv){
int n;
cout<<"输入石子的堆数\n";
cin>>n;
cout<<"输入各堆的石子数量\n";
for(int i=1;i<=n;i++){
cin>>stones[i];
}
highway(n);
cout<<"公路玩法\n";
cout<<"Min "<<Min[1][n]<<endl;
cout<<"Max "<<Max[1][n]<<endl;
playground(n);
return 0;
}
输入输出样例
输入石子的堆数
6
输入各堆的石子数量
5 8 6 9 2 3
公路玩法
Min 84
Max 129
操场玩法
Min 81
Max 130
--------------------------------
Process exited after 15.4 seconds with return value 0
请按任意键继续. . .