DP---DAG、背包、LIS、LCS
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]