题目链接

大意

给出\(N\)个数的序列,每次操作可以选择连续的三个数,将中间的那个数抽出,将另外两个数的数值加上中间那个数的数值。

一直执行以上操作直到只剩最后两个数,求最后两个数的所有可能的和的最小值。

(\(1\le N\le 18\))

思路

由于\(N\)的奇妙的范围,易想到状态压缩与双向BFS,然而,该题选数顺序对状态的限制太大,故不能。

考虑分治解决,枚举一段区间最后选的数,将其分为两段区间。

设该段区间左端点对答案的贡献为\(X\)次,右端点对答案的贡献为\(Y\)次。

那么在只剩最后选的数,左端点,右端点三个点时,我们选择最后选的数那个点,

那么此时左端点与右端点都分别加上了最后那个数的权值,那么最后那个数对答案的贡献就是\(X+Y\)次。

这样我们就可以分治下去了。

\(F(L,R,X,Y)\)表示左端点为L,右端点为R,左端点贡献为X次,右端点贡献为Y次的区间合并成两个数的最小和。最终所求答案为\(F(1,N,1,1)\)。

(小注:这样做的状态数实际上是\((N^2\cdot2^N)\)级别的,转移时间是\(O(N^3\cdot2^N)\)级别的)

代码

不加记忆化能过,用map加了记忆化就不能了。。。

好迷呀。

#include<map>
#include<cstdio>
#include<algorithm>
using namespace std;
#define LL long long
#define pr(a,b) make_pair(a,b)
const int MAXN=20;
const long long INF=5e18;
int N;long long A[MAXN];
long long Solve(int L,int R,LL X,LL Y){
if(L+1>=R)return 0;
long long ret=INF;
for(int i=L+1;i<=R-1;i++)
ret=min(ret,Solve(L,i,X,X+Y)+Solve(i,R,X+Y,Y)+A[i]*(X+Y));
return ret;
}
int main(){
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%lld",&A[i]);
printf("%lld\n",A[1]+A[N]+Solve(1,N,1,1));
}

【AGC035D】Add and Remove(脑洞 DP 分治)的更多相关文章

  1. @atcoder - AGC035D@ Add and Remove

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

  2. eclipse tomcat add and remove工程异常

    1  eclipse导入工程后,右击server add and remove工程时,there are no resource: 解决方案:右击工程->单击property->选择pro ...

  3. eclipse中tomcat使用add and remove无法发布web项目

    继上次启动eclipse中的tomcat报classNotFound的问题后,这次又遇到新问题.就是右键点击tomcat使用add and remove发布web项目至tomcat后,启动tomcat ...

  4. [置顶] 有关ListIterator接口的add与remove方法探究

    ListIterator接口继承自Iterator接口,新增了add()等方法. 关于ListIterator的add()方法的作用(接口是没有方法实现的,但其实现类对于add()方法的实现机制大致相 ...

  5. Arrays.asList 为什么不能 add 或者 remove 而 ArrayList 可以

    分析如下例子: 1 import java.util.Arrays; 2 import java.util.List; 3 4 5 public class Test { 6 public stati ...

  6. eclipse中tomcat的add and Remove找不到项目

    在我们运行项目前,都需要将项目部署到tomcat上,但是有时我们会遇到这种情况:项目明明存在,但是eclipse中tomcat的add and remove找不到项目,无法部署,那么这个问题该如何解决 ...

  7. 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException

    Java中,可以使用Arrays.asList(T... a)方法来把一个数组转换为List,返回一个受指定数组支持的固定大小(注意是固定大小)的列表.此方法同 Collection.toArray( ...

  8. [Firebase] 1. AngularFire, $save, $add and $remove, Forge

    Basic angularFire options: $save, $add and $remove. The way connect firebase: var app = angular.modu ...

  9. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException

    场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...

随机推荐

  1. nginx rewrite 基础

    一.跳转到首页  如果请求的页面不存在的话就跳转到首页 location / {      if (!-e $request_filename){        rewrite ^/(.*) /ind ...

  2. js对象数组多字段排序

    来源:js对象数组按照多个字段进行排序 一.数组排序 Array.sort()方法可以传入一个函数作为参数,然后依据该函数的逻辑,进行数组的排序. 一般用法:(数组元素从小大进行排序) var a = ...

  3. 1.linux中的常用命令

    本文积累工作中常用到的Linux命令 1. rz -be 文件上传到Linux服务器 此命令执行时,会弹出文件选择对话框,选择好需要上传的文件之后,点确定,就可以开始上传的过程了.上传的速度取决于当时 ...

  4. TexStudio中Bibtex使用

    TexStudio中Bibtex使用 1.首先在百度文库中找到相应的参考文献: 2.建立bibfile.bib文件,放在和.tex同一目录下,将上面页面的结果考入该文件,注意其中第一行中的Tuan20 ...

  5. windows10双系统删除linux

    问题 在这里删除后会发现有残留一个引导区,几百m(下图已经删除完),而且启动会进linux引导,然后必须f12进入选择启动项才可以启动windows 解决方法 使用删除引导就可以了 再使用傲梅分区助手 ...

  6. unity3d百度语音+图灵机器人

    using NAudio.Wave; using System; using System.Collections; using System.Collections.Generic; using S ...

  7. vue3源码node的问题

    下载vue3源码后,下载依赖时,node的版本需要在10.0.0以上,并且不同的vue3里面的插件的配置对版本依赖还不同,14.0.0以上的版本基本都不支持win7了, win7系统可以安装12.0. ...

  8. openssl基本原理 + 生成证书(转)

    https://blog.csdn.net/cpcpcp123/article/details/108885922 https://liruzhen.blog.csdn.net/article/det ...

  9. golang中bufio和ioutil的使用

    bufio bufio包实现了带缓冲区的读写,是对文件读写的封装 bufio缓冲写数据 模式 含义 os.O_WRONLY 只写 os.O_CREATE 创建文件 os.O_RDONLY 只读 os. ...

  10. 【Vulnhub靶场】JANGOW: 1.0.1

    时隔这么久,终于开始做题了 环境准备 下载靶机,导入到virtualBox里面,这应该不用教了吧 开机可以看到,他已经给出了靶机的IP地址,就不用我们自己去探测了 攻击机IP地址为:192.168.2 ...