AGC035D Add and Remove

题意

给出\(n\)个数,每次删除一个不在两端的数,然后把它的权值加到相邻的两个数上。

问操作\(n-2\)次后,所剩的两数之和的最小值

\(n\le18\)

题解

暴力存储每一个数的状态肯定不行。

考虑计算每一个数被计算了多少次。

可以发现\(1\)和\(n\)一定只被计算了1次

最后一个被消除掉的数应只被计算\(2\)次

可以发现,如果左端点被计算\(x\)次,右端点被计算\(y\)次

那么左右端点之间最后一个被消除的数被计算了\(x+y\)次

然后就可以开始记忆化搜索了

注意全部都用\(map\)存储状态会\(TLE\),需要把其中一部分用数组存储

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int sz=20;
int n;
struct node{
int l,r,fl,fr;
const bool operator<(const node &p)const{
if(l!=p.l) return l<p.l;
if(r!=p.r) return r<p.r;
if(fl!=p.fl) return fl<p.fl;
if(fr!=p.fr) return fr<p.fr;
}
};
ll a[sz];
ll g[sz][sz][611][611];
map<node,ll>dp;
ll f(int l,int r,int fl,int fr){
if(l+1==r) return 0;
if(fl<611&&fr<611){
if(g[l][r][fl][fr]) return g[l][r][fl][fr];
}
else if(dp[(node){l,r,fl,fr}]) return dp[(node){l,r,fl,fr}];
ll ret=1e18;
ll sum=fl+fr;
for(int i=l+1;i<=r-1;i++){
ret=min(ret,sum*a[i]+f(l,i,fl,sum)+f(i,r,sum,fr));
}
if(fl<611&&fr<611) return g[l][r][fl][fr]=ret;
else return dp[(node){l,r,fl,fr}]=ret;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
printf("%lld\n",a[1]+f(1,n,1,1)+a[n]);
}

AGC035D的更多相关文章

  1. @atcoder - AGC035D@ Add and Remove

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 张排成一行的卡片,第 i 张卡片上面写着 Ai. 重复 ...

  2. 【AGC035D】Add and Remove(脑洞 DP 分治)

    题目链接 大意 给出\(N\)个数的序列,每次操作可以选择连续的三个数,将中间的那个数抽出,将另外两个数的数值加上中间那个数的数值. 一直执行以上操作直到只剩最后两个数,求最后两个数的所有可能的和的最 ...

随机推荐

  1. Window中在Intellij idea开发时常用快捷键

    以下idea中的快捷键是在window 7中确认过,如果快捷键不起作用,可能是该快捷键被其它软件占用,或系统不同导致. 1.Ctrl + Z:撤回代码: 2.Ctrl + Shift + Z:恢复撤回 ...

  2. Pascal代码自动格式化

    const WEnter=; key=; next_line:..WEnter]of string=(';','begin','else','then','repeat','do','var'); k ...

  3. 廖雪峰Java12maven基础-2maven进阶-2模块管理

    1. 把大项目拆分为模块是降低软件复杂度的有效方法 在Java项目中,我们通常会会把一个项目分拆为模块,这是为了降低软件复杂度. 例如:我们可以把一个大的项目氛围module-a, module-b, ...

  4. ThinkPHP 删除数据

    ThinkPHP删除数据使用delete方法,例如: 直线电机价格 $Form = M('Form'); $Form->delete(5); 表示删除主键为5的数据,delete方法可以删除单个 ...

  5. IDEA启动springboot项目一直build

    启动main方法后,项目一直在不断的build,期间截了两张一闪而过的提示 我用的是Run Dashboard面板,不论是通过删除configuration,rebuild,删除IDEA缓存都没有效果 ...

  6. mybatis 一对多和一对一写法注意事项

    <resultMap id="ChartResultMap" type="com.qif.dsa.ucenter.planinfo.entity.ChartDate ...

  7. php日期

    PHP Date() 函数 PHP date() 函数用于格式化时间/日期. 该函数可把时间戳格式化为可读性更好的日期和时间. 时间戳是一个字符序列,表示一定的事件发生的日期/时间. 语法 date( ...

  8. (转)剖析Linux文件编码的查看及修改

    Linux文件编码的查看和修改都有不止一种做法,如果你需要在Linux中操作windows下的文件,那么很可能会经常遇到文件编码转换的问题,如何进行这项工作,也应该是经常工作在双系统下的操作者的必须掌 ...

  9. js实现获取两个日期之间所有日期的方法

    function getDate(datestr){ var temp = datestr.split("-"); var date = new Date(temp[0],temp ...

  10. MyEclipse使用总结——MyEclipse安装maven插件[转]

    打开 myeclipse, MyEclipse -->  Preferences -->Maven4MyEclipse 确定jdk是可用的 选择自己安装的maven: 点击Add选中我们的 ...