記憶化搜索
先說結論:什么是記憶化搜索?
1.不依賴任何外部變量。
2.答案一返回值的形式存在,而不能以參數的形式存在。
3.對於同一組參數,dfs的返回值是相同的,因為第一次都已經記錄過。
記憶化算法在求解的時候還是按着自頂向下的順序,但是每求解一個狀態,就將它的解保存下來,以后再次遇到這個狀態的時候,就不必重新求解了,直接調用這個狀態。該算法使用范圍:當一個題目根據具體判斷可能會出現重復的答案時候,或是不加以優化的暴力搜索會超時的時候,就可以考慮使用記憶化搜索。
其實記憶化搜索應該放在動態規划板塊,因為其思想和動態規划的思想很類似。
下面為記憶化搜索模板:
int g[MAXN];
int dfs(傳入數值) {
if (g[規模] != 無效數值) return g[規模];
if (終止條件) return 最小子問題解;
g[規模] = dfs(縮小規模);
return g[規模];
}
int main() {
... memset(g, 無效數值, sizeof(g));
...
}
上AC代碼:
//數字三角形-記憶化搜索
#include<bits/stdc++.h>
#define maxn 100
using namespace std;
int a[maxn][maxn],N,arr[maxn][maxn];
int f(int i,int j)
{
if(i==N-1) return a[i][j];
if(arr[i][j])
return arr[i][j];
arr[i][j]=a[i][j]+max(f(i+1,j),f(i+1,j+1));
return arr[i][j];
}
int main()
{
memset(arr,0,sizeof(arr));
cin>>N;
for(int i=0;i<N;i++)
for(int j=0;j<=i;j++)
cin>>a[i][j];
cout<<f(0,0)<<endl;
}