1. 程式人生 > 其它 >初一動態規劃專題測試 總結

初一動態規劃專題測試 總結

跳躍的奶牛

這道題很像股票買賣問題,可以用動態規劃解決。

首先這道題裡面有兩個因素:

  • 當前準備選第幾個藥水
  • 當前是奇數還是偶數

所以定義 \(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]\) 是選了這個藥的價值

初始化:

考慮 \(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