寒假前曾信誓旦旦說要多練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種型別的卡片,見樣例 每種型別的卡片上分...