andre_joy

导航

hdu 1078

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1078

题意:老鼠偷吃,有n*n的方阵,每个格子里面放着一定数目的粮食,老鼠每次只能水平或竖直最多走k步,每次必须走食物比当前多的格子,问最多吃多少食物。

mark:记忆化搜索。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int n,m,max1;
int s[110][110],dp[110][110];
int tab[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};

int max(int a, int b) {return a > b ? a : b;}

int dfs(int x, int y)
{
    int xx,yy;
    int max1 = 0, sum;
    if(!dp[x][y])
    {
        for(int j = 1; j <= m; j++)
        {
            for(int i = 0; i < 4; i++)
            {
                xx = x+tab[i][0]*j;
                yy = y+tab[i][1]*j;
                if(xx >= 0 && xx < n && yy >= 0 && yy < n && s[xx][yy] > s[x][y])
                {
                    sum = dfs(xx, yy);
                    max1 = max(max1, sum);
                }
            }
        }
        dp[x][y] = max1+s[x][y];
    }
    return dp[x][y];
}

int main()
{
    int i,j;
    while(scanf("%d%d", &n, &m), n > 0)
    {
        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++)
                scanf("%d", &s[i][j]);
        memset(dp, 0, sizeof(dp));
        printf("%d\n", dfs(0, 0));
    }
    return 0;
}

posted on 2012-08-19 16:14  andre_joy  阅读(750)  评论(0编辑  收藏  举报