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. php 例子

    图片上传 uploadify(flash版是免费的) 12个最好的 HTML5 jQuery 文件上传脚本 20款最好的jQuery文件上传插件

  2. 函数的作用域、作用域链以及return关键字

    1.作用域 全局作用域:在函数外部使用var关键字定义的变量 局部作用域:在函数内部使用var关键字定义的变量 特点   (1)局部变量无法直接影响全局变量    (2)在局部作用域中可以使用全局作用 ...

  3. Ubuntu Service说明与使用方法

    1 什么是Ubuntu的Service 网上很多资料说, service就是linux中随开机自启动的, 并且在后台运行的程序. 个人认为, 至少对于Ubuntu来说, 这个说法是不太准确的, 这只不 ...

  4. 「题解」:[AHOI2012] 树屋阶梯

    A掉了第一道题然后就去肝第四题,被路过的Larry大神看到了. L:你怎么还没过掉第三题? 我:…… L:快我帮你过掉! 他拉下来我第一题的码,手改了两个参数,半分钟后:AC …… 然后我就理所当然的 ...

  5. Django之深入了解路由层

    目录 ORM表关系建立 一对一 一对多 多对多 Django 请求生命周期 url 路由层 路由匹配 无名分组 有名分组 反向解析 路由匹配条件无分组的情况的反向解析 无名分组情况的反向解析 有名分组 ...

  6. CF1166D——数学公式思维题

    #include<bits/stdc++.h> using namespace std; #define ll long long ll ans[],a,b,m; /* b=2^(n-2) ...

  7. 基于OneMap的水利行业共享服务平台搭建步骤

    今天上午再次学习Esri技术培训中心的“GIS服务共享与运维管理——之OneMap解决方案”课程,从中学习了OneMap的产品架构以及基于OneMap共享服务平台的搭建步骤.下面把其中水利行业的共享服 ...

  8. Java-MyBatis-MyBatis3-XML映射文件:缓存

    ylbtech-Java-MyBatis-MyBatis3-XML映射文件:缓存 1.返回顶部 1. 缓存 MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制. 为了使它更 ...

  9. PAT甲级——A1081 Rational Sum

    Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum. ...

  10. MyBatis注解开发-@Insert和@InsertProvider(转)

    @Insert和@InsertProvider都是用来在实体类的Mapper类里注解保存方法的SQL语句.不同的是,@Insert是直接配置SQL语句,而@InsertProvider则是通过SQL工 ...