超经典的动态规划,我就不说了.
my code:
#include<stdio.h>
#include<memory.h>
int n;
int a[101],s[101][101],t[101][101];
int i,j,k,temp,max,min;
int main(){
while(scanf("%d",&n)!=-1){
i=1;
while(i<=n){
scanf("%d",&a[i++]);
}
memset(t,0,sizeof(t));
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
for(k=i;k<=i+j-1;k++){
if(k>n) temp=k%n;
else temp=k;
t[i][j]+=a[temp];
}
}
}
memset(s,0,sizeof(s));
for(j=2;j<=n;j++){
for(i=1;i<=n;i++){
for(k=1;k<=j-1;k++){
if(i+k>n) temp=(i+k)%n;
else temp=i+k;
max=s[i][k]+s[temp][j-k]+t[i][j];
if(s[i][j]<max) s[i][j]=max;
}
}
}
max=0;
for(i=1;i<=n;i++){
if(max<s[i][n])
max=s[i][n];
}
memset(s,0,sizeof(s));
for(j=2;j<=n;j++){
for(i=1;i<=n;i++){
min=9999999;
for(k=1;k<=j-1;k++){
if(i+k>n) temp=(i+k)%n;
else temp=i+k;
s[i][j]=s[i][k]+s[temp][j-k]+t[i][j];
if(min>s[i][j]) min=s[i][j];
}
s[i][j]=min;
}
}
min=9999999;
for(i=1;i<=n;i++){
if(min>s[i][n])
min=s[i][n];
}
printf("%d"n",min);
printf("%d"n",max);
}
}
转载于:https://www.cnblogs.com/saintqdd/archive/2007/09/06/884896.html