-
O - FatMouse and Cheese
- HDU - 1078
- 根据题意只好扩散性搜索,就是那种在一个点对于它能走到的所有点暴力搜索,这样会超时。
- 记忆化搜索是这样实现的:可以理解为结果的形成是反向的,从终点向起点(0,0)慢慢形成,每次搜索一个点周围能够满足条件的点,每找到一个点就继续递归找这个点周围满足条件的点,最终找到的点将会是数值最大的,也就是终点,这时把矩阵map中的数值记录起来当作所有用它当作终点的路径反向搜索的最大值,然后向上层返回这个值,而对于上一层的这个点来说,下面返回的就是下面那段路程的数值的最大值,于是将这个返回上来的值和这个点的数值加起来当作最大值。
-
#include<iostream> #include<stdio.h> using namespace std; #define maxn 111 #define inf 0x3f3f3f3f int n,dp[maxn][maxn],m; int a[maxn][maxn],tx,ty; int to[5][2]= {{1,0},{-1,0},{0,-1},{0,1}}; bool judge(int x,int y) { if(x<0||y<0||x>=n||y>=n) return false; return true; } int dfs(int x,int y) { int ans=0; if(!dp[x][y]) { for(int i=1; i<=m; i++) for(int j=0; j<4; j++) { tx=x+to[j][0]*i; ty=y+to[j][1]*i; if(judge(tx,ty)) if(a[tx][ty]>a[x][y]) ans=max(ans,dfs(tx,ty)); } dp[x][y]=ans+a[x][y]; } return dp[x][y]; } int main() { while(~scanf("%d%d",&n,&m)) { if(n==-1&&m==-1) break; for(int i=0; i<n; i++) for(int j=0; j<n; j++) { scanf("%d",&a[i][j]); dp[i][j]=0; } printf("%d\n",dfs(0,0)); } return 0; }
O - FatMouse and Cheese -记忆化搜索
最新推荐文章于 2023-03-04 09:06:12 发布