@atcoder - AGC035D@ Add and Remove
@description@
给定 N 张排成一行的卡片,第 i 张卡片上面写着 Ai。
重复以下操作,直到只剩下两张卡片。
取出卡片 i,将卡片 i 左边的卡片与卡片 i 右边的卡片的 A 加上 Ai。
求最后剩下的两张卡片的 A 的可能的最小和。
Constraints
2≤N≤18, 0≤Ai≤10^9(1≤i≤N)
Input
输入格式如下:
N
A1 A2 ... AN
Output
输出最小和。
Sample Input 1
4
3 1 4 2
Sample Output 1
16
先选 1 得到 4 5 2,再选此时的 5 得到 9 7,最小和 9 + 7 = 16。
@solution@
考虑最朴素的暴力:枚举排列,表示卡片被取走的顺序,然后算贡献。
显然不够优秀。
注意到对于按序排放的卡片 a b c,假如 b 不被取走,则 a, c 之间取的顺序并不重要。
这意味着我们重复枚举了很多结果一样的状态。
一个 Ai 贡献次数 = 左边第一个比它后取走的卡片贡献次数 + 右边第一个比它后取走的卡片贡献次数。我们总是认为第 1 张卡片与第 N 张卡片是最后取走的,且贡献次数为 1。
考虑一种基于笛卡尔树的贡献计算方法:
从根开始向下递归,同时维护该子树 左边第一个比它后取走的卡片贡献次数 与 右边第一个比它后取走的卡片贡献次数。那么就可以算出每个结点的贡献次数。
那么我在搜索的时候可以一边枚举笛卡尔树的形态一边计算贡献。
这样总搜索量 = 16 个点组成的二叉树数量 = 第 16 个卡特兰数 = 35357670。可以通过该题目。
当然你可以用记忆化搜索。不过没有必要,而且 map 常数大,hash 反而麻烦了。
@accepted code@
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 20;
const ll INF = (1LL<<60);
int N; ll A[MAXN + 5];
ll dfs(int l, int r, int cntl, int cntr) {
if( l + 1 == r ) return 0;
ll ret = dfs(l, l+1, cntl, cntl+cntr) + dfs(l+1, r, cntl+cntr, cntr) + (cntl+cntr)*A[l+1];
for(int i=l+2;i<=r-1;i++)
ret = min(ret, dfs(l, i, cntl, cntl+cntr) + dfs(i, r, cntl+cntr, cntr) + (cntl+cntr)*A[i]);
return ret;
}
int main() {
scanf("%d", &N);
for(int i=1;i<=N;i++)
scanf("%lld", &A[i]);
printf("%lld\n", dfs(1, N, 1, 1) + A[1] + A[N]);
}
@details@
我连暴搜都不会了.jpg。
感觉用笛卡尔树理解起来更为直观,而且也更容易证明复杂度。
@atcoder - AGC035D@ Add and Remove的更多相关文章
- eclipse tomcat add and remove工程异常
1 eclipse导入工程后,右击server add and remove工程时,there are no resource: 解决方案:右击工程->单击property->选择pro ...
- eclipse中tomcat使用add and remove无法发布web项目
继上次启动eclipse中的tomcat报classNotFound的问题后,这次又遇到新问题.就是右键点击tomcat使用add and remove发布web项目至tomcat后,启动tomcat ...
- [置顶] 有关ListIterator接口的add与remove方法探究
ListIterator接口继承自Iterator接口,新增了add()等方法. 关于ListIterator的add()方法的作用(接口是没有方法实现的,但其实现类对于add()方法的实现机制大致相 ...
- Arrays.asList 为什么不能 add 或者 remove 而 ArrayList 可以
分析如下例子: 1 import java.util.Arrays; 2 import java.util.List; 3 4 5 public class Test { 6 public stati ...
- eclipse中tomcat的add and Remove找不到项目
在我们运行项目前,都需要将项目部署到tomcat上,但是有时我们会遇到这种情况:项目明明存在,但是eclipse中tomcat的add and remove找不到项目,无法部署,那么这个问题该如何解决 ...
- 数组转换为List(Arrays.asList)后add或remove出现UnsupportedOperationException
Java中,可以使用Arrays.asList(T... a)方法来把一个数组转换为List,返回一个受指定数组支持的固定大小(注意是固定大小)的列表.此方法同 Collection.toArray( ...
- [Firebase] 1. AngularFire, $save, $add and $remove, Forge
Basic angularFire options: $save, $add and $remove. The way connect firebase: var app = angular.modu ...
- 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException
场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...
- Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常
String[] queryNames = request.getParameterValues("queryName"); List<String> queryNam ...
随机推荐
- TZ_05_Spring_Transaction的纯注解开发
1.数据库配置 jdbcConfiguation.java 1>使用Spring的EL表达式配合@Value()注解 @Value("${jdbc.Driver}") pri ...
- ES6学习笔记之字符串的扩展
字符串的for of ES6 为字符串添加了遍历器接口,使得字符串可以被for...of循环遍历. const str='abcd'; for(let s of str){ console.log(s ...
- ACdream 1108(莫队)
题目链接 The kth number Time Limit: 12000/6000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) ...
- Eclipse luna安装SVN
Eclipse luna安装SVN 1.Subversive Plug in 的安装 打开Eclipse ,Help--->Install New Soft ----> 输入 “Luna ...
- C# Action 和Func
https://www.cnblogs.com/LipeiNet/p/4694225.html
- node 和npm环境安装
node 安装 1.下载node二进制文件 [root@baolin-images#>> ~]#wget https://nodejs.org/dist/v10.16.0/node-v10 ...
- 使用Python进行文件操作
作为高级语言,对文件进行操作时必不可少的功能.那么,Python是怎么对文件进行操作的呢? 1.什么是文件? 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容. 文件包括两种类型:文本文件 ...
- oracle常用的时间格式转换
1:取得当前日期是本月的第几周 select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'YY') se ...
- NKOJ1469 通向自由的钥匙
P1469通向自由的钥匙 时间限制 : 10000 MS 空间限制 : 65536 KB 问题描述 通向自由的钥匙被放n个房间里,这n个房间由n-1条走廊连接.但是每个房间里都有特别 的保护魔 ...
- hive拉链表取数
例如,一个借款用户在hive上的拉链表.(end_dt存放逻辑与普通介绍的拉链表不一致) 需要拉去它在2019-05-01日的状态, 取数逻辑是: select * from tb where sta ...