初一动态规划专题测试 总结

前言

先来调侃一下,某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]\)

code

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\),就是要加的分数,改变一下即可。

code

HDU1160 肥老鼠的速度

我一开始看到这道题的时候,其实想的是:两个数组嘛,肯定就是公共什么的,而这两个数组是一只老鼠的属性,肯定就是最长公共上升子序列。但是我又发现不太对劲,他们不能“公共”,毕竟是两个不同的属性。

但是我可以先满足一个元素的属性,至于后面的,等一会再 BB 不就行了吗?没错,我们可以先按重量排序,这样我们就可以只考虑速度,因为重量递增,所以我们要.......

思考:给你多个属性怎么办?
答案:排序的时候改变一下即可

code

HDU1260电影票

我看了看这道题,露出了邪恶的微笑,手控制不住的就打了记忆化。

爆搜即可,然后只需要记忆化一下就完事!!!!

code

posted @ 2021-11-09 21:35  Otue  阅读(26)  评论(0编辑  收藏  举报