李老师上课根本没法做笔记 所以就三天连起来一起写总结咯
动态规划(DP)
动态规划是noip最重要的知识点之一 刚开始学的时候理解起来有些困难 入门理解请见:
转送们
线性DP复习
动态规划思想
三要素:阶段、状态、决策
三前提:子问题重叠性、无后效性、最优子结构性质
动态规划是对问题空间进行的分阶段、有顺序、无重复、决策性的遍历求解类比有向无环图及其拓扑序
例题:
解析:
还有一些例题就不一一列举了 ,大家可以上各种oj上去切
背包问题
背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。(来自百度百科)
简单来说 背包就是DP中比较重要的一个分支
01背包
完全背包
eg:
多重背包
直接拆分法
二进制拆分法
单调队列
eg:
分组背包
伪代码:
memset(f,0xcf,sizeof(f));
f[0]=0;
for(int I= 1;i<=n;++I)
for(int j=m;j>=0;--j)
for(int k=1;k<=c[i];++k)
if(j>=v[I][k])
f[j]=max(f[j],f[j-v[I][k]]+w[i][k]);
区间DP
经典例题:
计数类DP
无向连通图计数
树形DP
背包类树形DP
伪代码(不保证能过):
动态规划的优化
优化“阶段” ——倍增优化
优化“状态” ——状态压缩动态规划
优化“转移” ——矩阵乘法加速、数据结构优化、单调队列优化、斜率优化
伪代码:
DP就像物理中的力学 又重要又难
老师讲DP的时候掉线频繁啊
DP是个好东西 还得自己慢慢啃……