• 石子合并


    #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;
    }

  • 相关阅读:
    Mybatis的动态sql以及分页
    Mybatis入门
    使用java代码操作Redis
    Redis安装和基本操作
    idea安装以及使用
    卢卡斯定理 Lucas (p为素数)
    三分/优选法(黄金分割法)求单峰函数极值
    缩点tarjan
    tarjan 求割点
    tarjan
  • 原文地址:https://www.cnblogs.com/zhangdashuai/p/3473743.html
Copyright © 2020-2023  润新知