区间dp及优化
看了下感觉区间dp就是一种套路,直接上的板子代码就好了。
基础题ac代码:石子归并
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- int dir[][]={{,},{,},{,},{,-},{-,},{-,-},{,-},{-,}};
- #define pi acos(-1)
- #define ls rt<<1
- #define rs rt<<1|1
- #define me0(s) memset(s,0,sizeof(s))
- #define me1(s) memset(s,1,sizeof(s))
- #define mef(s) memset(s,-1,sizeof(s))
- #define meinf(s) memset(s,inf,sizeof(s))
- #define inf 0x3f3f3f
- const int N=1e6+;
- inline int read() {
- char c=getchar(); int x=, f=;
- while(c<''|c>'') {if(c=='-') f=-;c=getchar();}
- while(c>=''&&c<='') x=x*+c-'',c=getchar();
- return x*f;
- }
- ll exgcd(ll a,ll b){
- if(b==) return a;
- exgcd(b,a%b);
- }
- ll q_pow(ll a,ll b,ll mod){
- ll anss=;
- while(b){
- if(b&) anss=anss*a%mod;
- a=a*a%mod;
- b>>=;
- }
- return anss;
- }
- ll q_mul(ll a,ll b,ll mod){
- ll anss=;
- while(b){
- if(b&) anss=(anss+a)%mod;
- a=(a+a)%mod;
- b>>=;
- }
- return anss;
- }
- int dp[][];
- int sum[];
- int stone[];
- int main(int argc, char * argv[]){
- ios::sync_with_stdio(false);
- int n;
- cin>>n;
- me0(sum);
- meinf(dp);
- for(int i=;i<=n;i++){
- cin>>stone[i];
- sum[i]=sum[i-]+stone[i];
- dp[i][i]=;
- }
- for(int len=;len<=n;len++){//枚举长度
- for(int j=;j+len<=n+;j++){//枚举起点,ends<=n
- int ends=j+len-;
- for(int i=j;i<ends;i++){//枚举分割点,更新小区间最优解
- dp[j][ends]=min(dp[j][ends],dp[j][i]+dp[i+][ends]+sum[ends]-sum[j-]);
- }
- }
- }
- cout<<dp[][n]<<endl;
- return ;
- }
但是这样一眼就看出来了复杂度是n3的复杂度,这个复杂度数据稍稍大点就爆了,所以还是要用到四边形不等式优化。
但是由于个人感觉很复杂,看了不是很懂,直接贴个链接:四边形不等式优化。
优化过的AC的代码:
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- int dir[][]={{,},{,},{,},{,-},{-,},{-,-},{,-},{-,}};
- #define pi acos(-1)
- #define ls rt<<1
- #define rs rt<<1|1
- #define me0(s) memset(s,0,sizeof(s))
- #define me1(s) memset(s,1,sizeof(s))
- #define mef(s) memset(s,-1,sizeof(s))
- #define meinf(s) memset(s,inf,sizeof(s))
- #define inf 0x3f3f3f
- const int N=1e6+;
- inline int read() {
- char c=getchar(); int x=, f=;
- while(c<''|c>'') {if(c=='-') f=-;c=getchar();}
- while(c>=''&&c<='') x=x*+c-'',c=getchar();
- return x*f;
- }
- ll exgcd(ll a,ll b){
- if(b==) return a;
- exgcd(b,a%b);
- }
- ll q_pow(ll a,ll b,ll mod){
- ll anss=;
- while(b){
- if(b&) anss=anss*a%mod;
- a=a*a%mod;
- b>>=;
- }
- return anss;
- }
- ll q_mul(ll a,ll b,ll mod){
- ll anss=;
- while(b){
- if(b&) anss=(anss+a)%mod;
- a=(a+a)%mod;
- b>>=;
- }
- return anss;
- }
- int dp[][];
- int sum[];
- int stone[];
- int main(int argc, char * argv[]){
- ios::sync_with_stdio(false);
- int n;
- cin>>n;
- me0(sum);
- meinf(dp);
- int s[][];
- for(int i=;i<=n;i++){
- cin>>stone[i];
- sum[i]=sum[i-]+stone[i];
- dp[i][i]=;
- s[i][i]=i;
- }
- for(int len=;len<=n;len++){//枚举长度
- for(int j=;j+len<=n+;j++){//枚举起点,ends<=n
- int ends=j+len-;
- for(int k=s[j][ends-];k<=s[j+][ends];k++){
- if(dp[j][ends]>dp[j][k]+dp[k+][ends]+sum[ends]-sum[j-]){
- dp[j][ends]=dp[j][k]+dp[k+][ends]+sum[ends]-sum[j-];
- s[j][ends]=k;
- }
- }
- }
- }
- cout<<dp[][n]<<endl;
- return ;
- }
区间dp及优化的更多相关文章
- HDU3480_区间DP平行四边形优化
HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前 i 个节点被分为 j 个区间所取得的最优值的情况 cost[i][j]表示从i ...
- POJ 1160 经典区间dp/四边形优化
链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...
- codeforces 1101F Trucks and Cities 区间dp+单调优化 好题
题目传送门 题意简述:(来自洛谷) 有n个城市坐落在一条数轴上,第ii个城市位于位置ai. 城市之间有m辆卡车穿行.每辆卡车有四个参数:si为起点编号,fi为终点编号,ci表示每行驶1个单位长 ...
- UVA - 1632 Alibaba (区间dp+常数优化)
题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...
- 蓝桥杯:合并石子(区间DP+平行四边形优化)
http://lx.lanqiao.cn/problem.page?gpid=T414 题意:…… 思路:很普通的区间DP,但是因为n<=1000,所以O(n^3)只能拿90分.上网查了下了解了 ...
- 51 nod 石子归并 + v2 + v3(区间dp,区间dp+平行四边形优化,GarsiaWachs算法)
题意:就是求石子归并. 题解:当范围在100左右是可以之间简单的区间dp,如果范围在1000左右就要考虑用平行四边形优化. 就是多加一个p[i][j]表示在i到j内的取最优解的位置k,注意能使用平行四 ...
- 51Nod 1022 石子归并 V2(区间DP+四边形优化)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...
- HDU 3506 (环形石子合并)区间dp+四边形优化
Monkey Party Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Tot ...
- hdu3516 Tree Construction (区间dp+四边形优化)
构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...
随机推荐
- zookeeper3台机器集群环境的搭建
三台机器zookeeper的集群环境搭建 Zookeeper 集群搭建指的是 ZooKeeper 分布式模式安装. 通常由 2n+1台 servers 组成. 这是因为为了保证 Leader 选举(基 ...
- NX二次开发-UFUN多按钮模态对话框UF_UI_message_dialog
NX11+VS2013 #include <uf.h> #include <uf_ui.h> UF_initialize(); //多按钮模态对话框 ; char title_ ...
- CSS3:CSS3 圆角
ylbtech-CSS3:CSS3 圆角 1.返回顶部 1. CSS3 圆角 CSS3 圆角 使用 CSS3 border-radius 属性,你可以给任何元素制作 "圆角". C ...
- iOS开发UITouch触摸API简介
1.UITouch简介 当用户触摸屏幕时,会创建一个UITouch对象: UITouch的作用保存着触摸相关的信息,比如触摸的位置.时间.阶段等: 当从开始到结束,系统会更新UITouch对象,结束时 ...
- tensorflow run()和 eval()
eval()只能用于tf.Tensor类对象,也就是有输出的Operation.对于没有输出的Operation, 可以用.run()或者Session.run() 所以我们训练的时候,对于优化器只能 ...
- log4j架构
Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. ...
- NodeJS学习笔记之Connect中间件模块(二)
一,开篇分析 大家好,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,做一个源码分析系列,我想上一篇文章大家也看了, 介绍了使用方式及用途,而这篇也是出于本人的兴趣 ...
- 关于ctype.h头文件使用说明
ctype.h里的函数概况: 1.字符测试函数 (1)函数原型均为 int isXXX( int ch) (2)参数为int,任何参数均被转换为整形 (3)只能处理[0,127]之间的值 2.字符映射 ...
- Spring MVC @RequestMapping注解详解(2)
@RequestMapping 参数说明 value:定义处理方法的请求的 URL 地址.(重点) method:定义处理方法的 http method 类型,如 GET.POST 等.(重点) pa ...
- sys_call_table HOOK
sys_call_table 这个东西,其实和 Windows 下的 SSDT 表,在功能上完全相同. 前一阵子学Linux驱动,遇到了这个系统调用表,然后我就想到Windows的SSDT表,既然SS ...