C++實現記憶搜尋演算法
阿新 • • 發佈:2018-12-23
1、記憶搜尋演算法:
給n*n地圖,老鼠初始位置在(0,0),它每次行走要麼橫著走要麼豎著走,每次最多可以走出k個單位長度,且落腳點的權值必須比上一個落腳點的權值大,求最終可以獲得的最大權值
2、思路
每次最多m步,記錄四個方向的下一次走法可以獲得的權值總和,只能直走。m種情況選最大。
3、程式碼實現
#include<iostream> #include<cstring> #include<cmath> #include<cstdio> #include<cstdlib> #include<algorithm> #include<stack> #include<queue> using namespace std; const int N = 109; int dp[N][N], a[N][N]; int px[] = {0, 0, -1, 1}; int py[] = {1, -1, 0, 0}; int dfs(int n, int m, int x, int y) { if(!dp[x][y]) { int ans = 0; for(int i=1; i<=m; i++)//最多m步 { int temp = 0;//記錄四個方向的下一次走法可以獲得的權值總和 for(int j=0; j<4; j++)//四個方向 { int tx = x + px[j]*i;//因為只能直走 int ty = y + py[j]*i; if(tx>=1 && tx<=n && ty>=1 && ty<=n && a[tx][ty]>a[x][y]) temp = max(temp, dfs(n, m, tx, ty)); } ans = max(ans, temp);//m種情況選最大 } dp[x][y] = ans + a[x][y];//記錄 } return dp[x][y]; } int main() { int n, m; while(~scanf("%d%d", &n, &m) && n!=-1 && m!=-1) { memset(dp, 0, sizeof(a)); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) scanf("%d", &a[i][j]); printf("%d\n", dfs(n, m, 1, 1)); } return 0; }