看了下感觉区间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及优化的更多相关文章

  1. HDU3480_区间DP平行四边形优化

    HDU3480_区间DP平行四边形优化 做到现在能一眼看出来是区间DP的问题了 也能够知道dp[i][j]表示前  i  个节点被分为  j  个区间所取得的最优值的情况 cost[i][j]表示从i ...

  2. POJ 1160 经典区间dp/四边形优化

    链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...

  3. codeforces 1101F Trucks and Cities 区间dp+单调优化 好题

    题目传送门 题意简述:(来自洛谷) 有n个城市坐落在一条数轴上,第ii个城市位于位置ai​. 城市之间有m辆卡车穿行.每辆卡车有四个参数:si​为起点编号,fi​为终点编号,ci​表示每行驶1个单位长 ...

  4. UVA - 1632 Alibaba (区间dp+常数优化)

    题目链接 设$dp[l][r][p]$为走完区间$[l,r]$,在端点$p$时所需的最短时间($p=0$代表在左端点,$p=1$代表在右端点) 根据题意显然有状态转移方程$\left\{\begin{ ...

  5. 蓝桥杯:合并石子(区间DP+平行四边形优化)

    http://lx.lanqiao.cn/problem.page?gpid=T414 题意:…… 思路:很普通的区间DP,但是因为n<=1000,所以O(n^3)只能拿90分.上网查了下了解了 ...

  6. 51 nod 石子归并 + v2 + v3(区间dp,区间dp+平行四边形优化,GarsiaWachs算法)

    题意:就是求石子归并. 题解:当范围在100左右是可以之间简单的区间dp,如果范围在1000左右就要考虑用平行四边形优化. 就是多加一个p[i][j]表示在i到j内的取最优解的位置k,注意能使用平行四 ...

  7. 51Nod 1022 石子归并 V2(区间DP+四边形优化)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1022 题目大意: N堆石子摆成一个环.现要将石子有次序地合并成 ...

  8. HDU 3506 (环形石子合并)区间dp+四边形优化

    Monkey Party Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Tot ...

  9. hdu3516 Tree Construction (区间dp+四边形优化)

    构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...

随机推荐

  1. leetcode-52-N皇后②

    题目描述: 方法一:回溯 class Solution: def totalNQueens(self, n: int) -> int: def backtrack(i,tmp,col,z_dia ...

  2. JUC 一 CyclicBarrier 与 Semaphore

    java.util.concurrent CyclicBarrier简介 CyclicBarrier:可重用屏障/栅栏 类似于 CountDownLatch(倒计数闭锁),它能阻塞一组线程直到某个事件 ...

  3. ETL工具-Kattle:查询 HTTP/WebService

      发送HTTP POST请求,获取返回内容.  发送HTTP GET请求,获取返回内容,可以从前面获取URL.参数名.参数值 通过Restful获取数据 通过webService获取数据 HTTP ...

  4. Spring-Security (学习记录五)--配置登录时,密码采用md5加密,以及获取登录信息属性监听同步自己想要的登录信息

    目录 1. PasswordEncoder 采用密码加密 2. 获取当前的用户信息 1. PasswordEncoder 采用密码加密 使用前面的例子.可以看出我们数据库密码是采用明文的,我们在登录的 ...

  5. 'ddkbuild.cmd' 不是内部或外部命令,也不是可运行的程序

    转自VC错误:http://www.vcerror.com/?p=49 问题描述: 错误:'ddkbuild.cmd' 不是内部或外部命令,也不是可运行的程序 解决方法: 详细的解决方法可参考VC错误 ...

  6. hexo next主题深度优化(八),微加速

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 通过不断地上网查资料,引用的js.css.图片 ...

  7. UVA 240 Variable Radix Huffman Encoding

    题目链接:https://vjudge.net/problem/UVA-240 题目大意 哈夫曼编码是一种最优编码方法.根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的 ...

  8. 新手git遇到的问题

    1. 如何撤销git add,不小心执行了git add . 操作,但是又不能提交所有的文件,因为对应不同的分支,现在怎么样可以将git add 撤销回来? 解决:git reset HEAD(暂时尝 ...

  9. ECMAScript1.3 数组 | 函数 | 作用域 | 预解析

    数组array 数组可以存储很多项,有顺序,很多项形成一个集合,就是数组. 数组字面量是:[] 如何获取数组中的数据:索引/下标,数组中的第一项的索引是从0开始的. ['kay', 'andy', 1 ...

  10. Spring AOP源码分析(二):AOP的三种配置方式与内部解析实现

    AOP配置 在应用代码中,可以通过在spring的XML配置文件applicationContext.xml或者基于注解方式来配置AOP.AOP配置的核心元素为:pointcut,advisor,as ...