HDU 1078 FatMouse and Cheese (dfs + dp记忆化搜索)

  • 题目链接 : HDU 1078
  • 题意: 给定N x N 的方阵,每个格子均有一个价值,问从[0, 0]从发,往上下左右四个方向走,每次至多只能走k个格子,且每次停留的格子必须比上一次停留的格子的价值大(严格大于), 问: 能吃到的最大价值为多少?
  • 解法: dp[i][j]表示从[i,j]出发能吃到的最大价值,由此进行记忆化搜索,即可得到答案.
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
#define repp(i, a, b) for(int i=(b); i>=(a); --i)
#define rep(i,a,b) for (int i=(a); i<=(b); ++i)
#define de(x) cout<< #x << " => " << (x) << endl
#define ms(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int inf = 0x3f3f3f3f;
const double PI=acos(-1);
const double eps=1e-9;
inline void file_put() {
    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
}
const int maxn = 1e2+5;
int n, k;
int a[maxn][maxn]; 

int dp[maxn][maxn];//表示从[i,j]从发能吃到的最大价值 
int dx[4]={0, 1, 0, -1};
int dy[4]={1, 0, -1, 0}; 
int solve(int x, int y){
    int ans=0;
    if(!dp[x][y]){
        rep(i, 1, k){
            rep(j, 0, 3){
                int xx = x + dx[j]*i;
                int yy = y + dy[j]*i;
                if(xx<1 || yy<1 || xx>n ||yy>n) continue;
                if(a[xx][yy] > a[x][y]){
                    ans = max(ans, solve(xx, yy));
                }           
            }
        }
        dp[x][y] = ans+a[x][y];
    }
    return dp[x][y];
}
int main() {
//  file_put();
    while(~scanf("%d %d", &n, &k), n!=-1 || k!=-1){
        ms(a, 0);
        ms(dp, 0);
        rep(i, 1, n){
            rep(j, 1, n){
                scanf("%d", &a[i][j]);
            }
        }
        printf("%d\n", solve(1, 1));
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值