对各位学NOI的大佬对于DP的总结的总结。
———-DP数据范围:———
1} 15,20 -> 状压/暴搜
2} 30 -> 折半搜索-二分搜索
3} 50 -> N^4 DP
4} 100~200 -> Floyed,图论等
5} 1000~2000 -> N^2 DP
6} 1e5 -> ……可能不是DP
7} 1e6 -> 贪心,分治
8} 1e10~1e12 -> 矩阵/快速幂
———DP如何思考:———
A}范围
a} 8~20 状压 看地图,枚举
b} 300~500 N^3 区间DP,dp[i][j]枚点
c} 1000~5000 N^2 dp[i] || dp[i][j] 看题意
B}优化
a} 可以二分:最长不下降,树上倍增
b} 单调队列
———DP能解决的问题:———
A}以位置定义状态
a} 最长不下降 O(N^2,N*logN) --> dp[i] & 贪心
b} 最长公共子序列 O(N^2) --> dp[i][j]
c} 状压DP --> dp[state]
d} 线形DP --> 树形DP --> dp[i]
B}以空间定义状态
a} 背包问题 --> f[i][j] -> 压缩状态不能为负 -> f[j-w[i]]+v[i].(01<-反向,完全<-正向)
b} 弗洛伊德 --> f[k][i][j] -> f[i][k]+f[k][j];
c} 字符串 --> f[n][k] -> n:位置 k:取k段
——–DP注意事项:——–
自己搞状态数量,如果需要暴搜(2^n,n^m,n!,C(n,m)),并尽可能地剪枝。
注意DP的优化与降维