zoj 1107 FatMouse and Cheese(记忆化搜索)

题目链接:点击链接

题目大意:老鼠从(0,0)出发,每次在同一个方向上最多前进k步,且每次到达的位置上的数字都要比上一个位置上的数字大,求老鼠经过的位置上的数字的和的最大值

 

#include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b
int n;
int k;//前进的步数
int map[105][105];
int ans[105][105];//记忆化搜索,保存中间搜索结果
int search(int x,int y)
{
    int dx,dy;//要去的下一个位置
    int i,maxx = 0;
    if(ans[x][y] != -1) return ans[x][y];//已经搜索过,直接返回结果
    for(i = 1 ; i <= k ; i ++)//向前走的步数
    {
        dx = x - i;//向上
        if(dx >= 0 && dx < n && map[dx][y] > map[x][y])
        {
            ans[dx][y] = search(dx,y);
            maxx = max(maxx,ans[dx][y]);
        }
        dx = x + i;//向下
        if(dx >= 0 && dx < n && map[dx][y] > map[x][y])
        {
            ans[dx][y] = search(dx,y);
            maxx = max(maxx,ans[dx][y]);
        }
        dy = y - i;//向左
        if(dy >= 0 && dy < n && map[x][dy] > map[x][y])
        {
            ans[x][dy] = search(x,dy);
            maxx = max(maxx,ans[x][dy]);
        }
        dy = y + i;//向右
        if(dy >= 0 && dy < n && map[x][dy] > map[x][y])
        {
            ans[x][dy] = search(x,dy);
            maxx = max(maxx,ans[x][dy]);
        }
    }
    return maxx + map[x][y];
}
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",&map[i][j]);
        memset(ans,-1,sizeof(ans));
        printf("%d\n",search(0,0));
    }
    return 0;
}


 

 

 

 

posted @ 2013-07-16 19:24  jlins  阅读(174)  评论(0编辑  收藏  举报