当前位置: 首页 > article >正文

石子合并

断环为链。

环形的最优合并方式,一定可以展开成长为n的链来处理。

怎样才是最优的合并方式?

n<=100。

枚举处理。

#include<bits/stdc++.h>
using namespace std;

signed main()
{
    int n; 
    cin>>n;
    vector<int>a(n+n+n+1),sum=a;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        a[i+n]=a[i];
    }

    for(int i=1;i<=3*n;i++)
    sum[i]=sum[i-1]+a[i];

    vector<vector<int>>f1(3*n+10,vector<int>(3*n+10,1e9)),f2(3*n+10,vector<int>(3*n+10,0));

    for(int i=1;i<=2*n;i++)
    f1[i][i]=0;

    for(int i=1;i<=2*n;i++)
    f1[i][i+1]=a[i]+a[i+1],
    f2[i][i+1]=a[i]+a[i+1];

    for(int len=3;len<=2*n;len++){
        for(int l=1;l+len-1<=2*n;l++){
            int r=l+len-1;
            for(int i=l;i<r;i++){
                f1[l][r]=min(f1[l][i]+f1[i+1][r]+sum[i]-sum[l-1]+sum[r]-sum[i],f1[l][r]);
                f2[l][r]=max(f2[l][i]+f2[i+1][r]+sum[i]-sum[l-1]+sum[r]-sum[i],f2[l][r]);
            }

        }
    }
    int ans1=f1[1][n],ans2=f2[1][n];
    for(int i=2;i<=n;i++)
    ans1=min(f1[i][i+n-1],ans1),
    ans2=max(f2[i][i+n-1],ans2);

    cout<<ans1<<endl<<ans2;

    
}

25/2/15 


http://www.kler.cn/a/547432.html

相关文章:

  • 深入探究Linux树状目录结构
  • Ae:常见的光照控件和材质控件
  • DeepSeek API 调用教程(基于 Ollama 实现)
  • 华为IEC104协议对接华为超充小程序
  • DeepSeek的开源核爆:当技术民主化重构AI权力版图
  • 封装neo4j的持久层和服务层
  • 牛客小白月赛110 —— D 智乃与长短期主义者博弈 python 补题 + 题解
  • 多个用户如何共用一根网线传输数据
  • 价目表终止无法内抛成功
  • STM32 I2C通信协议说明
  • 超纯水设备的智能化控制系统为用户带来安全简便的操作体验
  • 数组_有序数组的平方
  • ELK组成及实现原理
  • 【第7章:注意力机制与Transformer模型—7.4 NLP领域的BERT、GPT系列模型】
  • 高精度四则运算
  • 3.从零开始学会Vue--{{生命周期,工程化,组件化}}
  • LeeCode题库第十题
  • DeepSeek-R1论文阅读及本地调用
  • A003基于SpringBoot实现的社团管理系统
  • Java 设计模式之桥接模式