FatMouse and Cheese

题意是:

老鼠从(0,0)出发吃奶酪,能水平或竖直方向在map[][]上移动,至多移动k步,并且移动到的下一个位置必须比当前位置的奶酪多,求最多吃到的奶酪是多少。

由于题目要求有四个方向可以走,所以想到搜索,而要求走得最优解。所以可以用记忆化搜索。动态规划基础题,不过相当经典。

题目链接:http://acm.hdu.edu.cn/diy/contest_showproblem.php?pid=1003&cid=29505

代码:

#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int  map[101][101];
int dp[101][101];
int xx[4]= {0,0,-1,1};
int yy[4]= {1,-1,0,0};
int Max,ans,n,k;
/*
int dfs(int x,int y)
{
    Max=0;
    ans=0;
    for(int i=1; i<=k; i++)
    {
        for(int j=0; j<4; j++)
        {
            int dx=x+xx[j]*i;
            int dy=y+yy[j]*i;
            if(dx<n&&dx>=0&&dy<n&&dy>=0&&map[x][y]<map[dx][dy])
            {
                ans=dfs(dx,dy);
                if(Max<ans)
                    Max=ans;
            }
        }
        dp[x][y]=Max+map[x][y];
    }
    return dp[x][y];
}
*/
int DFS(int x,int y)
{
    int ans = 0,MAX = 0;
    for(int i = 1; i <= k; i++)
    {
        for(int j = 0; j < 4; j++)
        {
            int dx = x+xx[j]*i;
            int dy = y+yy[j]*i;
            if(dx>=0 && dx<n && dy>=0 && dy<n && map[x][y]<map[dx][dy])
            {
                ans = DFS(dx,dy);//每条路径能吃到的奶酪量
                if(ans > MAX)
                    MAX = ans;
            }
        }
        dp[x][y] = MAX+map[x][y];//从dp[x][y]开始能吃到的最大奶酪量
    }
    return dp[x][y];
}
int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        if(n==-1&&k==-1)
            break;
        memset(map,0,sizeof(map));
        memset(dp,0,sizeof(dp));
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                scanf("%d",&map[i][j]);
        int sum=DFS(0,0);
        cout<<sum<<endl;
    }
    return 0;
}

FatMouse and Cheese_第1张图片

你可能感兴趣的:(记忆化搜索)