初一动态规划专题测试 总结
前言
先来调侃一下,某zqw同学打记忆化打爆了(
HDU2713 跳跃的奶牛
这道题很像股票买卖问题,可以用动态规划解决。
首先这道题里面有两个因素:
- 当前准备选第几个药水
- 当前是奇数还是偶数
所以定义 \(dp[i][0/1]\) 表示前 \(i\) 个药水使用了奇数个药还是偶数个药(奇数是 \(0\),偶数是 \(1\))
状态转移方程推导:
- 如果当前使用了奇数个药
- 如果第 \(i\) 个药不选,那么答案为 \(dp[i-1][0]\)。
- 如果选第 \(i\) 个药,答案为 \(dp[i-1][1]+a[i]\) ,其中 \(+a[i]\) 是选了这个药的价值
- 如果当前使用了偶数个药,同理可得
初始化:
考虑 \(dp[1][1]\) 的初始化:如果当前一个药没选,为零;选了 \(2\) 个(因为是偶数)根本不可能,因为才考虑到第 \(1\) 个。
考虑 \(dp[1][0]\) 的初始化:选了 \(1\) 个,则答案为 \(a[1]\)。
HDU1243反恐训练营
题目很长,但其实就是要你求两个字符串的最长公共序列,然后计算分数。
先复习一下如何求最长公共子序列:
- 若 \(x[i]=y[j]\) ,\(dp[i][j]=dp[i-1][j-1]+1\).
- 否则:\(dp[i][j]=\max (dp[i-1][j],dp[i][j-1])\).
在这道题呢,后面加的那个 \(1\),就是要加的分数,改变一下即可。
HDU1160 肥老鼠的速度
我一开始看到这道题的时候,其实想的是:两个数组嘛,肯定就是公共什么的,而这两个数组是一只老鼠的属性,肯定就是最长公共上升子序列。但是我又发现不太对劲,他们不能“公共”,毕竟是两个不同的属性。
但是我可以先满足一个元素的属性,至于后面的,等一会再 BB 不就行了吗?没错,我们可以先按重量排序,这样我们就可以只考虑速度,因为重量递增,所以我们要.......
思考:给你多个属性怎么办?
答案:排序的时候改变一下即可
HDU1260电影票
我看了看这道题,露出了邪恶的微笑,手控制不住的就打了记忆化。
爆搜即可,然后只需要记忆化一下就完事!!!!