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. DNS配置-BIND安装配置全过程

    下载地址:ftp://ftp.isc.org/isc/ 下载bind,我下载的是bind-9.11.13.tar.gz 我下载的文件放在/root目录下进入目录解压缩 [root@localhost ...

  2. [WPF自定义控件]?Window(窗体)的UI元素及行为

    原文:[WPF自定义控件]?Window(窗体)的UI元素及行为 1. 前言 本来打算写一篇<自定义Window>的文章,但写着写着发觉内容太多,所以还是把使用WindowChrome自定 ...

  3. visual studio 注释模板

    /*----------------------------------------------------------------* 项目名称 :$rootnamespace$* 项目描述 :* 类 ...

  4. 18-3-bind

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 筛法求欧拉函数(poj2478

    求1-n的欧拉函数的值 #include <iostream> #include <cstdio> #include <queue> #include <al ...

  6. LoadRunner参数化详解【转】

    距离上次使用loadrunner 已经有一年多的时间了.初做测试时在项目中用过,后面项目中用不到,自己把重点放在了工具之外的东西上,认为性能测试不仅仅是会用工具,最近又想有一把好的利器毕竟可以帮助自己 ...

  7. MySQL数据库(安装+增删改查)

    一. 安装 下载地址 : https://dev.mysql.com/downloads/mysql/ 1. 安装步骤 (1) 选择5.7版本 (2) 针对操作系统的不同下载不同的版本 (3) 解压 ...

  8. duilib教程之duilib入门简明教程3.第一个程序 Hello World

    小伙伴们有点迫不及待了么,来看一看Hello World吧:新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #in ...

  9. 我眼中javascript的这些年

    写了两年多的js了吧,一开始的目标并没有很学术,我只想安安静静做个很厉害的开发者.但是总是沉溺在一种语言里,会让人误以为这种语言很厉害,就像只在村子里混的话,我觉得我自己可以逆天,村外有人,编程世界也 ...

  10. Sequelize 中文API文档-1. 快速入门、Sequelize类

    1. https://itbilu.com/nodejs/npm/VkYIaRPz-.html#api-init 2. http://docs.sequelizejs.com/manual/tutor ...