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编辑  收藏  举报

导航