記憶化搜尋專題
阿新 • • 發佈:2020-09-14
思想
記憶化搜尋的思想無非就是:搜尋 + DP
注意!!!
- 記憶化搜尋要判斷是從起點直接搜dfs(0,0)還是for迴圈遍歷每一個點都要去搜!
- 判斷是否需要標記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; }