【AGC035D】Add and Remove(脑洞 DP 分治)
大意
给出\(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 分治)的更多相关文章
- @atcoder - AGC035D@ Add and Remove
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 N 张排成一行的卡片,第 i 张卡片上面写着 Ai. 重复 ...
- 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 ...
随机推荐
- js 盒子逐渐缓慢移动效果
注释:可以用于盒子弹出,收回效果,比如:某东的产品详情页,侧边有购物车.优惠卷等,鼠标经过弹出效果 可以看这个网址使用案例:https://www.cnblogs.com/jq-growup/p/15 ...
- Linux架构中代理服务器配置与负载均衡
本期内容概要 代理 负载均衡 内容详细 1.代理 1.主要作用: 将流量平均分配 2.代理的方式 01 正向代理 外部想要访问服务器 先找代理 找到之后还需要找服务器 应用:VPN 02 反向代理 外 ...
- CAP 6.0 版本发布通告 - 支持 OpenTelemetry
前言 今天,我们很高兴宣布 CAP 发布 6.0 版本正式版,在这个版本中,我们主要致力于对 OpenTelemetry 提供支持,以及更好的适配 .NET 6. 那么,接下来我们具体看一下吧. 总览 ...
- dos 之 for循环(小“病毒”)
需求: 1.自动在D盘下创建test2019文件夹: 2.自动在test2019下面创建100个文件,并写入"这是文件几的内容!": 3.自动打开100个CMD运行窗口(保持打开状 ...
- Jenkins_centos7安装jenkins(1)
Jenkins自动化部署的流程 一.下载安装 下载安装JDK wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/j ...
- Flask_获取请求信息(三)
引用request的方法: from flask import request 与Django不同的是,flask是不需要将request对象作为第一个参数传入视图函数,他的request对象是来自于 ...
- Shell 中的 expect 命令
目录 expect 介绍 expect 安装 expect 语法 自动拷贝文件到远程主机 示例一 示例二 示例三 示例四 expect 介绍 借助 expect 处理交互的命令,可以将交互过程如 ss ...
- Vue系列教程(一)之初识Vue
一.Vue和MVVM Vue是一个渐进式的js框架,只注重视图层,结合了HTML+CSS+JS,非常的易用,并且有很好的生态系统,而且vue体积很小,速度很快,优化很到位. Vue技术周四MVVM开发 ...
- .gitignore文件编写规则
1.gitignore说明 在使用git的过程中,一般我们总会有些文件无需纳入git的管理,也不希望它们总出现在未跟踪文件列表,这些文件通常是日志文件.临时文件.编译产生的中间文件.工具自动生成的文件 ...
- Visual Studio 2022(VS2022)激活密钥
Visual Studio 2022(VS2022) 激活码: 专业版 Pro: TD244-P4NB7-YQ6XK-Y8MMM-YWV2J 企业版 Enterprise: VHF9H-NXBBB-6 ...