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

DAG上的DP

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

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

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

背包问题

1.完全背包

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

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

2.01背包

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

​ 简化后

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

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

3.多重背包

  1. int f[N],v[N],w[N],n;
  2. for (int i = 1; i <= n0; i++)
  3. {
  4. cin >> wi >> vi >> ci;
  5. for (int j = 1; j <= ci; j <<= 1;)
  6. {
  7. ++n;
  8. v[n] = vi * j;
  9. w[n] = wi * j;
  10. ci -= j;
  11. }
  12. if (c > 0)
  13. {
  14. ++n;
  15. v[n] = vi * c;
  16. w[n] = wi * c;
  17. }
  18. }
  19. for (int i = 1 ; i <= n; i++)
  20. for (int j = m ; j >= w[i]; j--)
  21. {
  22. f[j] = max(f[j],f[j-w[i]] + v[i]);
  23. }

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

4.分组背包

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

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

5.树形背包

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

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

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

LIS问题

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

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

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

LCS问题

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

  1. for(int i = 1; i <= n1; i++)
  2. for(int j = 1;j<=n2;j++)
  3. if (i==j)dp[i][j] = dp[i-1][j-1]+1;
  4. else dp[i][j] = max(dp[i-1][J],dp[i][j-1]);
  5. 最终结果为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实现

    ——参考自<算法图解> def findSmallest(arr): # 假设第一个元素最小 smallest = arr[0] smallest_index = 0 for i in r ...

  2. 关于jsp 获得当前绝对路径的方法

    方法1) request.getRequestURL(); 方法2)  request.getScheme()+"://"+request.getServerName()+&quo ...

  3. Zabbix--02 自定义监控主机

    目录 一. Zabbix 监控基础架构 二. zabbix 快速监控主机 1.安装zabbix-agent 2.配置zabbix-agent 3.启动zabbix-agent并检查 4.zabbix- ...

  4. 第三次作业—Wordcount

    一.地址 Github项目地址:https://github.com/1320068008/WordCount-1 同伴蒋鑫作业地址:https://www.cnblogs.com/JxsBK/p/1 ...

  5. ASP.NET Core 基础知识(三) Program.cs类

    ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...

  6. 值栈ValueStack的原理与生命周期

    1.ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样.当Struts2接受一个请求时,会迅速创建ActionCo ...

  7. CSS3边框 圆角效果 border-radius

    border-radius是向元素添加圆角边框 使用方法: border-radius:10px; /* 所有角都使用半径为10px的圆角 */ border-radius: 5px 5px 5px ...

  8. 如何删除Github上的仓库

    1.首先,进入自己的github账户页面,点击头像选择下面的Your repositorys,点击进入 2.进入以后选中自己要删除的仓库,点击进去该仓库界面 3.找到Settings按钮,点击进入 4 ...

  9. pyserial库-串口通讯模块

    pySerial 封装了串口通讯模块,支持Linux.Windows.BSD(可能支持所有支持POSIX的操作系统),支持Jython(Java)和IconPython(.NET and Mono). ...

  10. css3 宽度百分比减去固定宽度 无效问题

    一定要注意中间横线的间距才有效果 正确 width: calc(50% - 10px); 错误 width:calc(50%-10px);