石子合并

#include<iostream>
#include<cstring>
using namespace std;
int ma[300][300];
int h[300][300];
int a[300];
int main()
{
 int n,max,sum,i,k,ii,j,f;
 while(cin>>n)
 {
  for(i=0;i<n;i++)
   cin>>a[i];
  for(i=n;i<=2*n-1;i++)
   a[i]=a[i-n];
  memset(ma,0,sizeof(ma));
  memset(h,0,sizeof(h)); 
  for(i=1;i<n;i++)//合并i个
  {
   for(j=0;j<n;j++)//从第i个合并
   {
    max=0;
    f=9999999;
    for(k=j;k<j+i;k++)
    {
     if(max<ma[j][k]+ma[k+1][j+i])
      max=ma[j][k]+ma[k+1][j+i];
     if(f>h[j][k]+h[k+1][j+i])
     { 
      f=h[j][k]+h[k+1][j+i];
     }
    }
    sum=0;
    for(ii=j;ii<=j+i;ii++)
     sum+=a[ii];
    ma[j][j+i]=max+sum;
    if(f==999999) f=0;
    h[j][j+i]=f+sum;
    if(j+i+n<=n*2-1)//对称分布
    {
     ma[j+n][j+i+n]=ma[j][j+i];
     h[j+n][j+i+n]=h[j][j+i];
    }
   }
  }
 
  max=0;
  for(i=0;i<n;i++)
   if(max<ma[i][i+n-1])
    max=ma[i][i+n-1];
   f=9999999;
   int x;
   for(i=0;i<n;i++)
    if(f>h[i][i+n-1])
    {
     x=i;
     f=h[i][i+n-1];
    }
   cout<<f<<endl;
   cout<<max<<endl;
 }
 return 0;
}

 

posted @ 2013-12-13 19:49  _一千零一夜  阅读(131)  评论(0编辑  收藏  举报