HDOJ 1078 FatMouse and Cheese

来源:互联网 发布:信息推广软件 编辑:程序博客网 时间:2024/05/21 10:30

记忆化深搜应该由后向前递归,记录下数据,再次使用时方可节省时间。

一开始我是由前向后进行,so超时。

#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>#define INF 0x7FFFFFFF#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))int a[105][105],n,k,r[105][105],v[105][105],max;int mov[4][2]= {{0,1},{1,0},{-1,0},{0,-1}};void dfs(int x,int y){    int i,j,x0,y0;    if(r[x][y]>max)max=r[x][y];    for(i=0; i<4; i++)    {        for(j=1; j<=k; j++)        {            x0=x+mov[i][0]*j;            y0=y+mov[i][1]*j;            if(x0<0||y0<0||x0>=n||y0>=n||v[x0][y0]==1)continue;            if(a[x0][y0]>a[x][y]&&r[x][y]+a[x0][y0]>r[x0][y0])            {                r[x0][y0]=r[x][y]+a[x0][y0];                v[x0][y0]=1;                dfs(x0,y0);                v[x0][y0]=0;            }        }    }}int main(){    int i,j;    while(scanf("%d%d",&n,&k),n!=-1&&k!=-1)    {        for(i=0; i<n; i++)            for(j=0; j<n; j++)                scanf("%d",&a[i][j]);        memset(r,0,sizeof(r));        memset(v,0,sizeof(v));        max=0;        r[0][0]=a[0][0];        v[0][0]=1;        dfs(0,0);        printf("%d\n",max);    }    return 0;}