動態規劃訓練日記

2021-10-23 16:46:52 字數 1379 閱讀 2348

1.洛谷p1244青蛙過河

lgp1244青蛙過河

動態規劃

狀態表示:dp[i][j]表示石墩數量為i,荷葉數量為j時能夠走過青蛙的數量。

狀態轉移:

因為青蛙在石墩上必須按照漢諾塔的形式排列。所以要從起點走到終點,必須要讓編號最大的青蛙,先跳過去。為了這個目的,我們需要把編號最大的青蛙上面的青蛙全部挪開。那麼,當i=0,j=k時,

因為只能有k個青蛙先跳到荷葉上,所以能通過的青蛙數目為k(荷葉上的青蛙)+1(起點處的青蛙),即

dp[0][k]=k+1;接下來我們考慮當i=1,j=k時的情況:可以想象成是起點變成了兩個石墩。那麼由於乙個石墩上可以放置k+1個青蛙,兩個石墩就可以放置(k+1)*(1<<1)個青蛙。以此類推可得狀態轉移方程:

#include

using

namespace std;

typedef

long

long ll;

ll dp[

3200][

3200];

ll h,k;

intmain()

先別急著抄**,讓我們繼續向下分析:

dp[i][j]=dp[i-1][j]2=4dp[i-2][j]=8*dp[i-3][j]……

易得 dp[i][j]=dp[0][k]*2^h

由此可得
#include

using

namespace std;

typedef

long

long ll;

ll h,k;

intmain()

2.洛谷p1676神奇的四次方數

洛谷p1676神奇的四次方數

完全揹包問題

狀態表示:dp[j]代表需要拼出的元素為j時,所需的最少的數字數。

狀態轉移:如果把每個數的四次方看成完全揹包問題中的體積,把取數的數量看成價值。那麼這個問題就變成了乙個完全揹包問題(題中沒有說這n個四次方數不可以相同)。套用完全揹包可得狀態轉移方程:(完全揹包問題在屬性為min的形況下時一定會填滿的)

#include

#include

#include

#include

#include

using

namespace std;

int m;

const

int m=

110000

;int dp[m]

;int v[m]

;int

main()

} cout<

}

訓練日記 20161024

初賽好像不會掛了,好開心!版權原因,不上傳題目。題意 求1 n n 1000 的排列中逆序對恰好為 k 個的排列數目。多測。題解 f i j 表示前 i 個數,逆序對個數恰好為 j的排列個數,易得轉移方程f i j i 1k 0f i 1 j k 用字首和優化可使複雜度降為o n2 題意 對於乙個長...

訓練日記 20170324

長久不更新部落格了。期間經歷了恰好被ag線踩的wc,經歷了漫長痛苦的小高考準備。現在終於可以重整旗鼓,向省選進發!幾個月來,唯一不變的是我仍然是個超級蒟蒻 版權原因,不上傳題目。題意 最小樹形圖 去年就接觸 聽說 過的演算法,一直沒有真正寫過。因為各種奇怪的細節錯誤,調了好幾個小時 比如找環時沒有判...

訓練日記 20170328

今天的題目似乎很水 好多人都提前ak離場了,於是提前一小時收題。但是我還是各種不會。思維江化?話說,聽到一句很有趣的話 山不在高,有林則徐 水不在深,有江 題意 給定一棵有n n 105 個節點的有根樹,編號互不重複。詢問有多少棵子樹內節點編號構成乙個連續區間。題解 水題,對於每個節點 i 記錄以該...