1. 程式人生 > 實用技巧 >記憶化搜尋專題

記憶化搜尋專題

思想

記憶化搜尋的思想無非就是:搜尋 + DP

注意!!!

  1. 記憶化搜尋要判斷是從起點直接搜dfs(0,0)還是for迴圈遍歷每一個點都要去搜!
  2. 判斷是否需要標記book,還是book直接作為搜到已經搜過的直接返回的陣列!

POJ1088-滑雪

注意:POJ上不能用萬能標頭檔案,把標頭檔案註釋掉之後用C++提交會無法提交(直接報錯:error: bits/stdc++.h: No such file or directory,必須刪除才可以。(為啥我也不曉得)

必須刪除前幾行註釋掉的部分:

//#include<bits/stdc++.h>
//using namespace std;
//typedef long long ll;

AC程式碼:

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<list>
#include<stdlib.h>
#include<map>
#include<stack>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
#define sc(T) scanf("%d",&T)
#define scc(x,y) scanf("%d %d",&x,&y)
#define pr(T) printf("%d\n",T)
#define f(a,b,c) for (int a=b;a<c;a++)
#define ff(a,b,c) for (int a=b;a>c;a--)
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
#define PI acos(-1)

int a[110][110],n,m,ans,book[110][110];
int to[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};

//void dfs(int x,int y,int cnt)
int dfs(int x,int y)
{
//    if(cnt<=ans)
//        return;
//    ans=max(ans,cnt);
    if(book[x][y])
        return book[x][y];
    //book[x][y]=1;
    f(i,0,4)
    {
        int tx=x+to[i][0];
        int ty=y+to[i][1];
//      if(tx>=0&&tx<n&&ty>=0&&ty<m&&!book[tx][ty])
        if(tx>=0&&tx<n&&ty>=0&&ty<m&&a[tx][ty]<a[x][y])
        {
            // book[tx][ty]++; // book[tx][ty]=1;

            //book[tx][ty]=max(book[tx][ty],dfs(tx,ty));
            book[x][y]=max(book[x][y],dfs(tx,ty)+1);

            //book[tx][ty]--; // book[tx][ty]=0;
        }
    }
    return book[x][y];
}

int main()
{
    cin>>n>>m;
    f(i,0,n)
    {
        f(j,0,m)
        cin>>a[i][j]; 
    }
//    dfs(0,0,0);
    ans=0; //小於等於0即可
    f(i,0,n)
    {
        f(j,0,m)
        ans=max(ans,dfs(i,j));
    }
    cout<<ans+1<<endl;
    return 0;
}

HDU1078-FatMouse and Cheese

題意:自行百度。
AC程式碼:

//#include<bits/stdc++.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<list>
#include<stdlib.h>
#include<map>
#include<stack>
#include<stdio.h>
#include<queue>
using namespace std;
typedef long long ll;
#define sc(T) scanf("%d",&T)
#define scc(x,y) scanf("%d %d",&x,&y)
#define pr(T) printf("%d\n",T)
#define f(a,b,c) for (int a=b;a<c;a++)
#define ff(a,b,c) for (int a=b;a>c;a--)
#define inf 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define eps 1e-9
#define PI acos(-1)

int n,k,ans,a[110][110],book[110][110];
int to[4][2]= {{0,1},{0,-1},{-1,0},{1,0}};

int dfs(int x,int y)
{
    if(book[x][y])
        return book[x][y];
    f(i,0,4)
    {
        f(j,0,k+1)
        {
            int tx=x+to[i][0]*j;
            int ty=y+to[i][1]*j;
            if(tx>=0&&tx<n&&ty>=0&&ty<n&&a[tx][ty]>a[x][y])
                book[x][y]=max(book[x][y],dfs(tx,ty));
        }
    }
    //return book[x][y];
    return book[x][y]+=a[x][y];
}

int main()
{
    while(~scc(n,k),n!=-1||k!=-1)
    {
        mem(book,0);
        f(i,0,n)
        {
            f(j,0,n)
            sc(a[i][j]);
        }
        int w=dfs(0,0);
        //cout<<w<<endl;
        cout<<book[0][0]<<endl;
    }
    return 0;
}

HDU1978-How many ways