記憶化搜尋:演算法上依然是搜尋的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。
記憶化演算法在求解的時候還是按著自頂向下的順序,但是每求解乙個狀態,就將它的解儲存下來,
以後再次遇到這個狀態的時候,就不必重新求解了。
例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...