HDU1078

来源:互联网 发布:贝斯谱的软件 编辑:程序博客网 时间:2024/05/21 21:02

题意:

在n*n的网格里面,每个点都有若干块奶酪,老鼠从(1,1)出发,每次最多走k步(只能水平或者竖直行走),且每一次的落脚点必须比上一点的奶酪多,问最多能吃到多少块奶酪。


思路:

网格嘛直接就是dfs来一发记忆化搜索就好了,dp[i][j]表示从点(i,j)出发可以获得的最多奶酪。


代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int n,k,dp[105][105],a[105][105];int to[4][2] = {1,0,-1,0,0,1,0,-1};int check(int x,int y){    if(x<1 || y<1 || x>n || y>n)        return 1;    return 0;}int dfs(int x,int y){    int ans = 0;    if(!dp[x][y])//是否已经计算出结果    {        for(int i = 1; i<=k; i++)        {            for(int j = 0; j<4; j++)            {                int xx = x+to[j][0]*i;                int yy = y+to[j][1]*i;                if(check(xx,yy))//越界                    continue;                if(a[xx][yy]>a[x][y])                    ans = max(ans,dfs(xx,yy));            }        }        dp[x][y] = ans+a[x][y];    }    return dp[x][y];}int main(){    int i,j;    while(~scanf("%d%d",&n,&k),n>0&&k>0)    {        for(i = 1; i<=n; i++)            for(j = 1; j<=n; j++)                scanf("%d",&a[i][j]);        memset(dp,0,sizeof(dp));        printf("%d\n",dfs(1,1));    }    return 0;}