記憶化搜索


記憶化搜索

先說結論:什么是記憶化搜索?

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; 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM