hdu 1078(dfs记忆化搜索)
题意:容易理解...
思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的,然后一直递归先求出后面的点,最后达到求解的效果。
代码实现:
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int map[105][105],count[105][105]; int n,k; int b[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; int dfs(int x,int y) { int i,j,temp,max=-0,t1,t2; if(count[x][y]<0) { for(i=1;i<=k;i++) { for(j=0;j<4;j++) { t1=x+b[j][0]*i; t2=y+b[j][1]*i; if(t1>=1&&t1<=n&&t2>=1&&t2<=n&&map[t1][t2]>map[x][y]) { temp=dfs(t1,t2); if(max<temp) max=temp; } } } count[x][y]=max+map[x][y]; } return count[x][y]; } int main() { int i,j; while(scanf("%d%d",&n,&k)!=EOF&&n!=-1||k!=-1) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&map[i][j]); count[i][j]=-1; } printf("%d\n",dfs(1,1)); } return 0; }
posted on 2013-07-22 09:35 后端bug开发工程师 阅读(1234) 评论(0) 编辑 收藏 举报