初一動態規劃專題測試 總結
阿新 • • 發佈:2021-11-09
跳躍的奶牛
這道題很像股票買賣問題,可以用動態規劃解決。
首先這道題裡面有兩個因素:
- 當前準備選第幾個藥水
- 當前是奇數還是偶數
所以定義 \(dp[i][0/1]\) 表示前 \(i\) 個藥水使用了奇數個藥還是偶數個藥(奇數是 \(0\),偶數是 \(1\))
狀態轉移方程推導:
- 如果當前使用了奇數個藥
- 如果第 \(i\) 個藥不選,那麼答案為 \(dp[i-1][0]\)。
- 如果選第 \(i\) 個藥,答案為 \(dp[i-1][1]+a[i]\) ,其中 \(+a[i]\) 是選了這個藥的價值
- 如果當前使用了偶數個藥
- 如果第 \(i\) 個藥不選,那麼答案為 \(dp[i-1][1]\)
- 如果選第 \(i\) 個藥,答案為 \(dp[i-1][0]-a[i]\) ,其中 \(-a[i]\) 是選了這個藥的價值
- 如果第 \(i\) 個藥不選,那麼答案為 \(dp[i-1][1]\)
初始化:
考慮 \(dp[1][1]\) 的初始化:如果當前一個藥沒選,為零;選了 \(2\) 個(因為是偶數)根本不可能,因為才考慮到第 \(i\) 個。
考慮 \(dp[1][0]\) 的初始化:選了 \(1\) 個,則答案為 \(a[1]\)。
程式碼參見:bzoj
反恐訓練營
題目很長,但其實就是要你求兩個字串的最長公共序列,然後計算分數。
先複習一下如何求最長公共子序列:
- 若 \(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\),就是要加的分數,改變一下即可。、
具體程式碼:bzoj