(DP002)(滾動陣列)洛谷P1541烏龜棋

2021-10-03 01:55:11 字數 1126 閱讀 6559

寒假前曾信誓旦旦說要多練dp,還立了帖子要做一百道,現在繼續第二道吧。。。

題目很好理解,狀態的儲存和轉移都比較直觀,剛開始打算在狀態的dp陣列加乙個步數維度,表示走到第幾個格仔,但是這樣就成了五維陣列了,顯然會爆空間。後來發現沒有必要,當前格仔由當前使用的牌的數目完全匯出。所以平時解dp問題時,開始可能想到的狀態空間很複雜,這個沒關係,但是在實現之前一定要進行優化,考察各個維度是否是線性無關的。

分析到這裡這個問題已經得到了解決,(詳見**)。但是如果本題對於空間的要求更加嚴格的話,事實上我們還可以進行一下滾動陣列優化,再壓縮乙個維度。(其實這個滾動陣列優化這道題是在別人的題解中發現的思想,但是別人的題解的寫法筆者看不明白,所以就做了幾道其它的滾動陣列優化的dp,再用自己的寫法寫了本題的滾動陣列優化,個人感覺相對好懂一些吧。)

其他大佬的題解直接把第乙個維度壓掉了,筆者的**是把第乙個維度壓到2。

#include

#include

#include

#include

using

namespace std;

int n,m;

const

int maxn=42;

int a[

355]

;int b[maxn]

;int ans;

int f[2]

[maxn]

[maxn]

[maxn]

;//表示每種牌用了幾張,對第乙個維度進行滾動陣列優化

int cnt[5]

;int

main()

f[0][

0][0

][0]

=a[1];

//起點

for(

int i=

0;i<=cnt[1]

;i++)}

printf

("%d"

,max

(f[0

][cnt[2]

][cnt[3]

][cnt[4]

],f[1]

[cnt[2]

][cnt[3]

][cnt[4]

]));

return0;

}

洛谷 P1541 烏龜棋

題目背景 小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別...

洛谷P1541 烏龜棋

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...

洛谷P1541 烏龜棋

小明過生日的時候,爸爸送給他一副烏龜棋當作禮物。烏龜棋的棋盤是一行n個格仔,每個格仔上乙個分數 非負整數 棋盤第1格是唯一的起點,第n格是終點,遊戲要求玩家控制乙個烏龜棋子從起點出發走到終點。烏龜棋中m張爬行卡片,分成4種不同的型別 m張卡片中不一定包含所有4種型別的卡片,見樣例 每種型別的卡片上分...