T1:
赤裸裸的DP,以边长为状态,最后输出边长的平方即可.
T2:
也是DP.
输入时输入n,x,y
设f[i,j,k]表示选i个数,最大值为j,更新了k次的方案数.
很明显是由f[i-1][][]所对应的某些数来更新f[i,j,k]的,则当枚举的第i个数小于等于j时,相应的状态为f[i-1,j,k]*j(为什么乘j是因为第i个数可能是1~j的每一个数)
当大于时很明显是f[i-1][1..j-1][k-1]的总和,则我们可以存储一个数,表示f[i-1][1..j-1][k-1]的和,每次在循环里面更新sum.
最后输出f[n][1..x][y]内的和即可.
(这里需要注意一,我们要把k循环放到j循环外面,因为这样存储的那个数才容易储存)
T3:
可以直接暴力,然后接近O(n²)的效率来计算答案是否等于M.
然而也可以求出每一个数到顶的时候,对于不同的n,分别计算的系数是多少.
然后,每次递归的时候,直接加上枚举的数*系数即可,再加上些剪枝,1ms内可行.
T4:
堆.
把天数按从小到大排好序之后,每次对于第i天所对应的期限,如果可以直接学习的话,则把他加入堆尾并维护性质,且把天数+1,否则的话,则判断第i天对应的学分是否大于小点堆的堆顶,如果大于的话则替换,并维护性质.

本文解析了四道典型的动态规划题目,包括不同状态转移方程的应用与优化技巧。第一题利用边长作为状态;第二题关注数值选择与更新次数;第三题介绍了一种高效的递归方法;第四题运用堆数据结构进行任务调度。
2154

被折叠的 条评论
为什么被折叠?



