A 这个是dp?有构造算法。
B 状态压缩。卡时间。解决方法是二分查找可行的组合并且用记忆化dfs跳过没用的状态。
C 矩阵快速幂加速dp。发现正面很难计数,于是从反面思考,用总数减掉。想出初始矩阵还有变换的矩阵,这道题将dp分为5类来转移。
D 0/1背包+完全背包。在转移的时候判断当前是只能拿一件还是无数件的,然后按照常规方程转移。方向是相反的。
E 要用滚动数组。
F 矩阵dp。注意没法到的点的处理。
G 求LIS。递归打印解。求字典序最小的时候,遍历整个dp数组如果符合且值最小就记录下来,继续递归。
H 求出四个端点到任意一点的最大好感度 然后枚举所有不在边界上的点作为相遇点去求最大值
I dp符合四边形不等式。写程序的时候我用了记忆化搜索。在搜索中如果s数组没求出来就用原始方程的值,之后再修改,所以要用引用类型。
J 环上的博弈dp。有点意思。dp上有环,解决方案是不去理他。初始值都设为“平局”,然后从第一个点反着记忆化dfs。如果这个是必败点,回去的这个点是必胜的。如果这个点是必胜的,回去的这个点出度减为0(就是计数),则为必败点。其他的情况则不dfs。
K 斜率dp入门。
L 轮廓线dp入门。
M 多重背包的二进制优化。
N dp[j][k]表示写了j行出现k个代码的种数,dp[j][k]=(dp[j][k]+dp[j-1][k-a[i]])%mod