藍橋杯 歷屆試題 地宮取寶(C C )

2021-10-21 14:00:15 字數 2297 閱讀 1736

記憶化搜尋

暴力搜尋的途中會經過很多重複的結點,這導致的普通dfs的超時,因此我們可以用乙個備忘錄來記錄每個狀態是否求解過了,當重複搜尋到同一狀態時,我們就可以直接返回而不必重複相同的遞迴操作了,這樣就大量節省時間複雜度。

備忘錄的定義:

根據題意,我們需要知道4個狀態,即當前的位置(i, j),以及當前拿了多少件寶物和最近拿的寶物的價值c

因此備忘錄是乙個四維陣列:memo[i][j][k][c]

根據要求,memo陣列的值應該表示從(i, j, k, c)這個狀態走到終點的合法方案數

細節問題:由於本題中寶物的價值可能為0,因此為了實現方便,我們給每個寶物的價值都加上1的偏移量,這樣我們就可以用c = 0表示當前乙個寶物都沒取的情況了,對於memo陣列的初始化,我們不能將其初始化為0,因為memo為0也屬於一種合法方案數,因此我們將其初始為-1

#include

#include

#include

using

namespace std;

const

int n =

55, m =

15, mod =

1e9+7;

int w[n]

[n];

int memo[n]

[n][m]

[m];

//memo[i, j, k, c]記錄當狀態為(i, j, k, c)時,繼續走直到終點的合法方案數

int n, m, k, ans;

intdfs

(int i,

int j,

int k,

int c)

int sum =0;

//記錄當前狀態走到終點的合法方案數

if(i +

1<= n)

if(j +

1<= m)

return memo[i]

[j][k]

[c]= sum % mod;

}int

main()

}memset

(memo,-1

,sizeof

(memo));

//memo[i, j, k, c]為0也是一種合法方案,因此我們的memo陣列必須初始化為-1

dfs(1,

1,0,

0);printf

("%d\n"

, memo[1]

[1][

0][0

]);return0;

}

動態規劃

c++ **

#include

#include

#include

using

namespace std;

const

int n =

55, m =

15, mod =

1000000007

;int c[n]

[n];

int f[n]

[n][m]

[m];

//狀態表示:f[i, j, k, c]表示走到(i, j), 手中恰好有k件寶物且最近取得的寶物價值為c的方案數

//遞推方程:

//(1)不選(i, j)處的寶物,f[i, j, k, c] = f[i - 1, j, k, c] + f[i, j - 1, k, c]

//(2)選(i, j)處的寶物,在 c = c[i][j], t < c的範圍中 f[i, j, k, c] += f[i - 1, j, k - 1, t] + f[i, j - 1, k - 1, t]

int n, m, k;

intmain()

} f[1]

[1][

1][c[1][

1]]=

1;//取第乙個物品

f[1]

[1][

0][0

]=1;

//不取第乙個物品

for(

int i =

1; i <= n; i++)}

}}}int ans =0;

for(

int i =

0; i <=

13; i++

) ans =

(ans + f[n]

[m][k]

[i])

% mod;

printf

("%d\n"

, ans)

;return0;

}

藍橋杯 歷屆試題 地宮取寶

我本來想dp的 可惜dp不出來 後來才知道是記憶化搜尋 至於那個返回的max 1是因為 本來返回max 的 但是因為一開始代入dfs的引數是 1 所以就要 1 include include const int mod 1000000007 int a 51 51 int dp 51 51 13 1...

藍橋杯 歷屆試題 地宮取寶

問題描述 x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小...

藍橋杯 歷屆試題 地宮取寶

資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x國王有乙個地宮寶庫。是n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意...