@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的更多相关文章

  1. eclipse tomcat add and remove工程异常

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常

    String[] queryNames = request.getParameterValues("queryName"); List<String> queryNam ...

随机推荐

  1. JavaScript中[]+[] 、[]+{}、{}+[]、{}+{}的结果分析

    看到这样一个问题:{} + [] 的结果是多少? 一脸懵逼.. 于是在chrome控制台运行 {} + [] 和用 console.log({} + []) 输出,发现结果不一样.. 于是,把各种可能 ...

  2. 关于CE的反思

    当你注视着你的分数, 眼眶倏地猛睁. 不会做的题血红一片, 认真做了的题一点墨蓝. 你知道, 你CE了, 你挂了, 你倒数第一了, 你当场去世了. 两小时的努力付诸东流, 线段树的碎片历历在目. 思考 ...

  3. java -cp ../../DESUtil/ Hello,用-cp指定classpath

    运行hello.class 文件 怎么用 java +路径 就是不在class目录下运行 怎么做??? 我想要的是 java 直接去运行某个路径下的class文件 不想到它的目录那里再java hel ...

  4. mysql与hibernate选择某个字段的最大值,比如表中的最大id

    hibernate public int getMaxId(Session session) { String hql = "SELECT MAX(id) FROM ArticleModel ...

  5. 2019-3-1-win10-uwp-发布旁加载自动更新

    title author date CreateTime categories win10 uwp 发布旁加载自动更新 lindexi 2019-03-01 09:40:27 +0800 2019-0 ...

  6. Jquery选择器分类:基本选择器,层次选择器,过滤选择器,表单选择器。

    基本选择器 说明:通过元素id.class和标签名等来查找DOM元素 1.id选择器:$("#test");//选取id为test的元素 2.类选择器:$(".test& ...

  7. Data Lake Analytics IP白名单设置攻略

    当我们成功开通了 DLA 服务之后,第一个最想要做的事情就是登录 DLA 数据库.而登录数据库就需要一个连接串.下面这个页面是我们首次开通 DLA 之后的界面,在这里我们要创建一个服务访问点. 在上面 ...

  8. python中bisect模块的使用

    一般用于二分查找, 当然列表应该是有序表 参考于: http://blog.csdn.net/xiaocaiju/article/details/6975714

  9. arcgis 点线面操作

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. php 简单加密解密

    <?php namespace App\Service; /* * @link http://kodcloud.com/ * @author warlee | e-mail:kodcloud@q ...