DP是真的难啊,感觉始终不入门路,还是太弱了┭┮﹏┭┮

DAG上的DP

​ 一般而言,题目中如果存在明显的严格偏序关系,并且求依靠此关系的最大/最小值,那么考虑是求DAG上的最短路或者是最长路。(据说还有路径计数的问题,我倒是没遇到,哪位大大看见提醒一下呐)

这类问题可以使用记忆化搜索直接解,但是有爆栈的风险。

数据比较大的情况下,可以使用先求拓扑序,然后按照拓扑序(bfs求拓扑序),进行递推即可。

背包问题

1.完全背包

	for (int i = 1; i <= n; i++)
for (int j = w[i]; j <= m; ++j)
f[j] = max(f[j],f[j - w[i]] + v[i]);

完全背包本质就是一个DAG问题,把背包的剩余容量看成状态,边就是物品的体积。

2.01背包

	for (int i = 1; i <= n; i++)
for (int j = 0; j <= m; j++)
if (j < w[i])
f[i][j] = f[i-1][j];
else
f[i][j] = max(f[i-1][j],f[i-1][j-w[i]] + v[i]);

​ 简化后

	for (int i = 1; i <= n; i++)
for (int j = w[i]; j <= m; ++j)
f[j] = max(f[j],f[j - w[i]] + v[i]);

01背包按刘汝佳的话说是一个多阶段决策问题,或者说是二维dp,也即是需要一个维度来考虑对于物品的使用。

3.多重背包

	int	f[N],v[N],w[N],n;
for (int i = 1; i <= n0; i++)
{
cin >> wi >> vi >> ci;
for (int j = 1; j <= ci; j <<= 1;)
{
++n;
v[n] = vi * j;
w[n] = wi * j;
ci -= j;
}
if (c > 0)
{
++n;
v[n] = vi * c;
w[n] = wi * c;
}
}
for (int i = 1 ; i <= n; i++)
for (int j = m ; j >= w[i]; j--)
{
f[j] = max(f[j],f[j-w[i]] + v[i]);
}

​ 把未知模型拆分为已知的模型, 把多重背包拆分成多个01背包,具体原则就是把一个数用logn(n为重复个数)来进行表示,使得物品的数量变成O(nlogm),然后复杂度变为O(nmlogm)

4.分组背包

	for (int i = 1 ; i <= n; i++)
for (int j = m; j >= 0; j--)
for (int k = 1; k <= len[i]; k++)
{
if(j - g[i][k])
f[j] = max(f[j],f[j-w[i][k]]+v[i][k]);
}

​ 在01背包的基础上,每个物品属于一个组,每组中的物品是互斥的。

5.树形背包

​ 在01背包的基础上,每个物品可能依赖于某个其他物品(需要选定某个前驱物品,才能选这个物品)

​ 1.得到dfs序,和每个结点对应的最远子树结点r

​ 2.按照dfs序从后往前,对于每件物品,考虑它选/不选两种情况如果不选,对应的整颗子树也不选,变成dfs序中子树最后一个的下一个 如果选,变成dfs序中的下一个。

LIS问题

​ dp[i]表示序列1~i的LCS,进行dp转移即可。

	for (int i = 1; i <= n ; i++)
for (int j = 1; j < i; j++)
if (j < i) dp[i] = max(dp[i],dp[j]+1)

​ 可以用树状数组优化,最终结果为dp[n]

LCS问题

​ dp[i][j]表示第一个序列1i,第二个序列1j位置的LCS。

	for(int i = 1; i <= n1; i++)
for(int j = 1;j<=n2;j++)
if (i==j)dp[i][j] = dp[i-1][j-1]+1;
else dp[i][j] = max(dp[i-1][J],dp[i][j-1]);
最终结果为dp[n1][n2];

DP---DAG、背包、LIS、LCS的更多相关文章

  1. 线性DP总结(LIS,LCS,LCIS,最长子段和)

    做了一段时间的线性dp的题目是时候做一个总结 线性动态规划无非就是在一个数组上搞嘛, 首先看一个最简单的问题: 一,最长字段和 下面为状态转移方程 for(int i=2;i<=n;i++) { ...

  2. dp入门(LIS,LCS)

    LCS

  3. USACO Money Systems Dp 01背包

    一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...

  4. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  5. NYOJ16|嵌套矩形|DP|DAG模型|记忆化搜索

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...

  6. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  7. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  8. HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)

    HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...

  9. HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)

    HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...

  10. HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包)

    HDOJ(HDU).1284 钱币兑换问题 (DP 完全背包) 题意分析 裸的完全背包问题 代码总览 #include <iostream> #include <cstdio> ...

随机推荐

  1. python之路之——操作系统的发展历史

    阅读目录 手工操作 —— 穿孔卡片 批处理 —— 磁带存储和批处理系统 多道程序系统 分时系统 实时系统 通用操作系统 操作系统的进一步发展 操作系统的作用 手工操作 —— 穿孔卡片 1946年第一台 ...

  2. Qt Creator的初步使用

    http://c.biancheng.net/view/1804.html 启动 Qt Creator,出现如图 1 所示的主窗口: 图 1 Qt Creator主窗口 Qt Creator 的界面很 ...

  3. Linux--Linux的网络--05

    一层: HUB --- 集线器 总线型结构,使用泛洪方式 二层: 在早期,pc通信只需要MAC地址进行数据转发 网桥 --- 交换机  :维护MAC地址表 三层: 网络的增大,就需要逻辑地址(IP地址 ...

  4. PAT Advanced 1011 World Cup Betting (20 分)

    With the 2010 FIFA World Cup running, football fans the world over were becoming increasingly excite ...

  5. macos升级Nodejs和Npm到最新版

    第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...

  6. 使用Vscode添加中文汉化插件

    一.首先打开Vscode,找到该软件的扩展,如下: 二.点击扩展按钮之后,会出现如下的界面,有一个扩展搜索输入框,输入chinese之后,会随之产生一些匹配的插件 三.重启一下Vscode,然后就看到 ...

  7. man cal

    CAL(1)                                                                  CAL(1) NAME       cal - 显示一个 ...

  8. Python私有变量(Private Variable)

    Variables can be private which can be useful on many occasions. A private variable can only be chang ...

  9. 【hackerrank】Placements

    题目如下: You are given three tables: Students, Friends and Packages. Students contains two columns: ID  ...

  10. SonarQube规则之漏洞类型

    漏洞类型: 1."@RequestMapping" methods should be "public"漏洞 阻断标注了RequestMapping是contr ...