HDU1078 Fat Mouse and Chess

一个记忆化搜索的题目,参考了网上的代码才写出来的。
dfs(x,y)表示从x,y开始走的话最大的结果是多少。每一次搜索上下左右k步中 最大的那一个 还有一点dp的思想。dp数组用来记录结果,并且防止重复判断。

#include<iostream>
#include<cstring>

using namespace std;

const int maxn = 110;
int G[maxn][maxn];
int dp[maxn][maxn];
int dir[4][2]={0,1,0,-1,1,0,-1,0};//一个表示方向的数组
int n,k;
int dfs(int a,int b)
{
    int ans = 0;
    if(!dp[a][b])
    {
        for(int i = 1 ; i <= k ; i++)
        {
            for(int j = 0 ; j < 4 ; j++)
            {
                int x=a+dir[j][0]*i,y=b+dir[j][1]*i;//xy是要遍历的坐标
                if(x>=0&&x<n&&y>=0&&y<n)
                {
                    if(G[x][y]>G[a][b])
                    {

                        ans = max(ans,dfs(x,y));
                    }
                }
            }
        }
        dp[a][b]=ans+G[a][b];
    }
    return dp[a][b];

}
int main()
{
    while(cin>>n>>k&&!(n==-1&&k==-1))
    {
        memset(G,0,sizeof(G));
        memset(dp,0,sizeof(dp));
        for(int i = 0 ; i < n ; i++)
        {
            for(int j = 0; j < n ; j++)
            {
                cin >> G[i][j];
            }
        }
        dfs(0,0);
        cout<<dp[0][0]<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值