区间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. vue组件双向绑定.sync修饰符的一个坑

    我们知道组件是单项的,但是有时候需要双向,这时候我们可以使用.sync修饰符,但今天遇到一个坑,一直不成功,花了半小时试出来的.... 在编程的时候我们很习惯冒号后面跟着空格.而.sync双向绑定需要 ...

  2. 伪响应式开发(PC和Mobile分离)

    screen.width 无论把浏览器缩小还是放大,screen.width的值都不会改变,但是IE9及以上浏览器才支持这个属性. @media screen 媒体查询的巨大缺陷:切换页面布局的时候J ...

  3. LotusScript_批量更改数据库标识符(id)

    OA开发中经常要搭建测试环境,测试环境的数据库与原数据库不能有ID冲突现象,以防混淆.以下是一个批量修改数据库标识符的方法,其中,取得这些需要更改的数据库,需要导出源服务器上的数据库路径和名称,方法详 ...

  4. Java 空对象设计模式(Null Object Pattern) 讲解

    转自:http://www.cnblogs.com/haodawang/articles/5962531.html 有时候我们的代码中为避免 NullPointerException 会出现很多的对N ...

  5. centos部署vue项目

    参考链接 nodejs服务器部署教程二,把vue项目部署到线上 打包 #在本地使用以下命令,打包 npm run build #打包之后本地会出现dist文件夹.将dist文件夹以及package.j ...

  6. php 调用微信虚拟支付

    摘要:小游戏对接微信虚拟支付,需要自己的后台调用微信的虚拟支付接口,微信的文档实在烂,总结走过的坑. 1.报错{errcode:90007,errmsg:invalid openid} 无效的open ...

  7. IOS中 copy ,strong ,weak ,assign使用区别

      .@property属性的用法 * weak(assign) :  代理\UI控件 * strong(retain) : 数组.模型)其他对象(除代理\UI控件\字符串以外的对象) * copy ...

  8. select_related()函数

    Django获取数据实体的时候,返回的对象一个实体或多个实体,也就是QuerySet,它是Django专有的东西,具体的理解,它是类似Python的字典的东西,但它并不实现字典的所有方法.今天讲解的是 ...

  9. 【HDU4676】Sum Of Gcd(莫队+欧拉函数)

    点此看题面 大致题意: 多组询问,求\(\sum_{i=L}^R\sum_{j=i+1}^Rgcd(i,j)\). 推式子 这道题我们可以考虑,每个因数\(d\)被统计答案的次数,肯定与其出现次数有关 ...

  10. IntelliJ IDEA / Eclipse 自动生成 Author 注释 签名

    Author 注释 签名如下: /*** @author 稚枭天卓 E-mail:zhxiaotianzhuo@163.com* @version 创建时间:2016-6-20 下午04:58:52* ...