区间DP主要思想是先在小区间取得最优解,然后小区间合并时更新大区间的最优解。
 
 
 
基本代码:
//mst(dp,0) 初始化DP数组
for(int i=;i<=n;i++)
{
dp[i][i]=初始值
}
for(int len=;len<=n;len++) //区间长度
for(int i=;i<=n;i++) //枚举起点
{
int j=i+len-; //区间终点
if(j>n) break; //越界结束
for(int k=i;k<j;k++) //枚举分割点,构造状态转移方程
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+][j]+w[i][j]);
}
}
 
 
 
 
 
【题目描述】
N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。
例如: 1 2 3 4,有不少合并方法
1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)
1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
 
Sample Input

4
1
2
3
4

Sample Output

19
 
 
预处理出区间和,然后枚举每个长度的区间和断点,转移即可。
f[i][j] = min(f[i][j], f[i][k]+f[k+1][j]+sum[j]-sum[i-1])
 
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = + ;
#define INF 0x3f3f3f3f int main()
{
int n;
scanf("%d", &n);
int sum[maxn];
int f[maxn][maxn];
memset(f, , sizeof(f)); for (int i = ; i <= n; i++)
{
int x;
scanf("%d", &x);
sum[i] = sum[i-]+x;
} for (int len = ; len <= n; len++)
{
for (int i = ; i <= n; i++)
{
int j = i+len-;
f[i][j] = INF;
for (int k = i; k < j; k++)
f[i][j] = min(f[i][j], f[i][k]+f[k+][j] + sum[j] - sum[i-]);
}
} printf("%d\n", f[][n]);
}
 

UVA - 10003 Cutting Sticks

题意:

有一根长度为 n 的木棍,m 个可以切开的位置。

如果把一个长木棍切成两根短木棍,那么花费就是那根长木棍的长度。

求把这根木棍按照 m 个切点全部切开的最小花费。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 100 + 100
#define INF 0x3f3f3f3f int main()
{
int n, m;
while(scanf("%d%d", &n, &m) == && n)
{
int x[maxn];
for (int i = ; i <= m; i++)
scanf("%d", &x[i]); x[] = , x[m+] = n; int f[maxn][maxn];
for (int i = ; i <= m+; i++)
{
for (int j = ; j <= m+; j++)
f[i][j] = INF;
f[i][i+] = ;
} for (int len = ; len <= m+; len++)
for (int i = ; i+len <= m+; i++)
{
int j = i+len;
for (int k = i+; k < j; k++)
f[i][j] = min(f[i][k] + f[k][j] + x[j] - x[i], f[i][j]);
} printf("The minimum cutting is %d.\n", f[][m+]);
}
}
 
 
有一串首位相连的环形能量珠项链,每个能量珠由头部和尾部组成。相邻的能量珠必定是某一个的头部 = 另一个的尾部。
可以把两个相邻的能量珠(a,b)(b,c)合成一个新的能量珠(a, c),并且释放 a * b * c的能量。
操作这串能量珠能够获得的最大的总能量是多少?

样例中,四个能量珠分别为(2, 3) (3, 5) (5, 10) (10, 2)

对于环形区间,我们只要把它展开成线形区间进行DP,然后取 dp[i, i+n-1] 中的最大值就可以了。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std; #define maxn 200 + 100
#define INF 0x3f3f3f3f int main()
{
int n;
while(~scanf("%d", &n))
{
int a[maxn], sum[maxn], f[maxn][maxn];
memset(sum, , sizeof(sum)); for (int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
a[n+i] = a[i];
}
a[*n+] = a[]; for (int i = ; i <= *n; i++)
for (int j = i; j <= *n; j++)
f[i][j] = ; for (int len = ; len <= *n; len++)
for (int i = ; i+len- <= *n; i++)
{
int j = i+len-;
for (int k = i; k < j; k++)
f[i][j] = max(f[i][j], f[i][k] + f[k+][j] + a[i]*a[k+]*a[j+]);
} int ans = ;
for (int i = ; i <= n; i++)
ans = max(ans, f[i][i+n-]); printf("%d\n", ans); } }

HDU - 3506 Monkey Party

也是普通的环形区间DP,拆环为链。

然而这样过不了的。因为数据范围是2000,n^3的DP会TLE。

所以需要用平行四边形优化。

这个玩意我还没有看懂,只是拿过来用。以后慢慢理解。

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std; #define maxn 2000 + 100
#define INF 0x3f3f3f3f int main()
{
int n;
while(~scanf("%d", &n))
{
int a[maxn], sum[maxn], f[maxn][maxn], s[maxn][maxn];
memset(sum, , sizeof(sum)); for (int i = ; i <= n; i++)
{
scanf("%d", &a[i]);
a[n+i] = a[i];
} for (int i = ; i <= *n; i++)
sum[i] = sum[i-] + a[i]; for (int i = ; i <= *n; i++)
{
f[i][i] = ;
s[i][i] = i; //这里的s数组也要初始化
for (int j = i+; j <= *n; j++)
f[i][j] = INF;
} for (int len = ; len <= *n; len++)
for (int i = ; i+len- <= *n; i++)
{
int j = i+len-;
for (int k = s[i][j-]; k <= s[i+][j]; k++) //单调性枚举
{
int tmp = f[i][k] + f[k+][j] + sum[j] - sum[i-];
if (tmp < f[i][j])
{
f[i][j] = tmp;
s[i][j] = k;
}
}
} int ans = INF;
for (int i = ; i <= n; i++)
ans = min(ans, f[i][i+n-]); printf("%d\n", ans); } }

区间DP入门题目合集的更多相关文章

  1. react-native 入门资源合集

    # 了解react-native React Native enables you to build world-class application experiences on native pla ...

  2. LightOJ 1422:Halloween Costumes(区间DP入门)

    http://lightoj.com/volume_showproblem.php?problem=1422 题意:去参加派对,有n场派对,每场派对要穿第wi种衣服,可以选择外面套一件,也可以选择脱掉 ...

  3. spark 入门教程合集

    看到一篇不错的 spark 入门教程的合集,在此记录一下 http://www.cnblogs.com/shishanyuan/p/4699644.html

  4. 树形DP入门题目推荐以及解析

    关于树形DP几道入门题目 今天恶补树形DP,感觉海星. 其实挺简单的. 介绍几道例题,我会的. 1.洛谷P1352 没有上司的舞会 我的一篇题解 我们可以考虑每一个节点都是有两种情况. 一个是被邀请: ...

  5. POJ 2955 Brackets (区间dp入门)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  6. 【DP】区间DP入门

    在开始之前我要感谢y总,是他精彩的讲解才让我对区间DP有较深的认识. 简介 一般是线性结构上的对区间进行求解最值,计数的动态规划.大致思路是枚举断点,然后对断点两边求取最优解,然后进行合并从而得解. ...

  7. hdu 4570 Multi-bit Trie 区间DP入门

    Multi-bit Trie 题意:将长度为n(n <= 64)的序列分成若干段,每段的数字个数不超过20,且每段的内存定义为段首的值乘以2^(段的长度):问这段序列总的内存最小为多少? 思路: ...

  8. POJ2955--Brackets 区间DP入门 括号匹配

    题意很简单,就是求给出串中最大的括号匹配数目.基础题,格式基本为简单区间dp模板. #include<iostream> #include<string.h> using na ...

  9. HRBUST - 1818 石子合并 区间dp入门

    有点理解了进阶指南上说的”阶段,状态和决策“ /* 区间dp的基础题: 以区间长度[2,n]为阶段,枚举该长度的区间,状态dp[l][r]表示合并区间[l,r]的最小费用 状态转移方程dp[l][r] ...

随机推荐

  1. Flask-Script-Migrate

    Flask-Script 从字面意思上来看就是 Flask 的脚本 是的,熟悉Django的同学是否还记得Django的启动命令呢? python manager.py runserver 大概是这样 ...

  2. ECMAScript Regex

    Everything has its own regulation by defining its grammar. ECMAScript regular expressions pattern sy ...

  3. 也谈ThreadLocal

    欢迎赐教博客地址(http://www.cnblogs.com/shizhongtao/p/5358411.html) 对于ThreadLocal使用,网上一堆一堆的.什么内存泄露,什么线程不安全.这 ...

  4. WHRER条件里的数据类型必须和字段数据类型一致

    首先看案例: 表中字段FPHONE_IMEI是varchar类型的,主键也建立在FPHONE_IMEI 字段上,原则上只要where条件中用到了这个字段,就会走索引,这也是建立索引的目的,可事实是这样 ...

  5. mybatis学习目录

    mybatis详解动态SQL https://www.cnblogs.com/ysocean/p/7289529.html mybatis查询时间段sql语句 http://www.cnblogs.c ...

  6. 类型信息(RTTI和反射)——RTTI

    运行时类型信息可以让你在程序运行时发现和使用类型信息. 在Java中运行时识别对象和类的信息有两种方式:传统的RTTI,以及反射.下面就先来说下RTTI. 1.RTTI: RTTI:在运行时,识别一个 ...

  7. expres webpack es6 babel 构建多页系统开发架构

    开始写点什么... 只是一个思路........

  8. phpStudy:使用localhost无法访问的解决方案

    今天遇到新的问题,很有意思,当使用Localhost时,发现报403错误: 百度找到问题所在:没有权限问题 所以我们打开phpStudy,找到配置文件“vhosts-conf”,看到的情况是这样的 接 ...

  9. 使用SSH密钥方式登录ubuntu Linux,指令(ssh-keygen 和 ssh-copy-id)

    实验目的 从myVM1(本地主机)上登录myVM2(远程主机).采用密钥方式,不输入密码. 测试环境 主机:window7 sp1 64位 专业版 虚拟机:VMware workstation 12 ...

  10. graphql 数据增删改查分页及关联操作(三)

    说明: 接第二篇文章,代码也是在第二篇文章之上 本文只是针对mondodb来操作 一.添加相关的包 yarn add Mongoose 二.初始化Mongodb 修改server.ts 导入 impo ...