記憶化搜尋

2021-07-10 07:13:39 字數 2047 閱讀 4191

記憶化搜尋:演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。

記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,

以後再次遇到這個狀態的時候,就不必重新求解了。

例1.題目描述:

給從左至右排好隊的小朋友們分糖果,

要求:

1.每個小朋友都有乙個得分,任意兩個相鄰的小朋友,得分較高的所得的糖果必須大於得分較低的,相等則不作要求。

2.每個小朋友至少獲得乙個糖果。

求,至少需要的糖果數。

輸入:

輸入包含多組測試資料,每組測試資料由乙個整數n(1<=n<=100000)開頭,接下去一行包含n個整數,代表每個小朋友的分數si(1<=si<=10000)。

輸出:

對於每組測試資料,輸出乙個整數,代表至少需要的糖果數。

樣例輸入:

3 1 10 1

3 6 2 3

2 1 1

樣例輸出:

4 5

2

#include

#include

#include

using

namespace

std;

#define max 111111

int cal(int r,int n,int dp,int a)

int main()

return

0;}

例2. hdu1978

problem description

這是乙個簡單的生存遊戲,你控制乙個機械人從乙個棋盤的起始點(1,1) 走到棋盤的終點(n,m) 。遊戲的規則描述如下:

1. 機械人一開始在棋盤的起始點並有起始點所標有的能量。

2. 機械人只能向右或者向下走,並且每走一步消耗一單位能量。

3. 機械人不能在原地停留。

4. 當機械人選擇了一條可行路徑後,當他走到這條路徑的終點時,他將只有終點所標記的能量。

如上圖,機械人一開始在(1,1) 點,並擁有4 單位能量,藍色方塊表示他所能到達的點,如果他在這次路徑選擇中選擇的終點是(2,4)點,當他到達(2,4) 點時將擁有1 單位的能量,並開始下一次路徑選擇,直到到達(6,6) 點。

我們的問題是機械人有多少種方式從起點走到終點。這可能是乙個很大的數,輸出的結果對10000 取模。

input

第一行輸入乙個整數t, 表示資料的組數。

對於每一組資料第一行輸入兩個整數n,m(1 <= n,m <= 100) 。表示棋盤的大小。接下來輸入n 行, 每行m 個整數e(0 <= e < 20) 。

output

對於每一組資料輸出方式總數對10000 取模的結果.

sample input

1 6 6

4 5 6 6 4 3

2 2 3 1 7 2

1 1 4 6 2 7

5 8 4 3 9 5

7 6 6 2 1 5

3 1 1 3 7 2

sample output

3948

#include

#include

#include

#include

using namespace std;

#define n 105

const int mod=10000;

int n,m;

int a[n][n];

int mark[n][n];

int dfs(int x,int y)

} tmp%=mod;

return mark[x][y]=tmp;

}int main()

}mark[n-1][m-1]=1;

printf("%d\n",dfs(0,0));

} return 0;

}

記憶化搜尋

演算法上依然是搜尋的流程,但是搜尋到的一些解用 動態規劃 的那種思想和模式作一些儲存。一般說來,動態規劃總要遍歷所有的狀態,而搜尋可以排除一些無效狀態。更重要的是搜尋還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求...

記憶化搜尋

原文 感謝作者。一.動態規劃 動態規劃 dynamic programming 與 分治思想 有些相似,都是利用將問題分 為子問題,並通過合併子問題的解來獲得整個問題的解。於 分治 的不同之處在 於,對於乙個相同的子問題動態規劃演算法不會計算第二次,其實現原理是將每乙個計算過的子問題的值儲存在乙個表...

記憶化搜尋

時間限制 c c 1秒,其他語言2秒 空間限制 c c 131072k,其他語言262144k 64bit io format lld 給定兩個長度為n的整數列a和b,每次你可以從a數列的左端或右端取走乙個數。假設第i次取走的數為a x,則第i次取走的數的價值v i bi a x,現在希望你求出 v...