第五届蓝桥杯C++B组 地宫取宝

代码:

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const ll mod = 1e9 + 7;
int N, M, K;
int mp[55][55];
ll dp[55][55][22][22];

void dfs(int st, int en, int num, int val) {
    if(dp[st][en][num][val] != -1) return;

    dp[st][en][num][val] = 0;
    if(st == N && en == M && num == K) {
        dp[st][en][num][val] = 1;
        return;
    }
    if(mp[st][en] > val && num < K) {
        dfs(st, en, num + 1, mp[st][en]);
        dp[st][en][num][val] += dp[st][en][num + 1][mp[st][en]];
        dp[st][en][num][val] %= mod;
    }
    if(st < N) {
        dfs(st + 1, en, num, val);
        dp[st][en][num][val] += dp[st + 1][en][num][val];
        dp[st][en][num][val] %= mod;
    }
    if(en < M) {
        dfs(st, en + 1, num, val);
        dp[st][en][num][val] += dp[st][en + 1][num][val];
        dp[st][en][num][val] %= mod;
    }
}

int main() {
    memset(dp, -1, sizeof(dp));
    scanf("%d%d%d", &N, &M, &K);
    for(int i = 1; i <= N; i ++) {
        for(int j = 1; j <= M; j ++)
            scanf("%d", &mp[i][j]);
    }

    dfs(1, 1, 0, 0);
    printf("%lld
", dp[1][1][0][0] % mod);

    return 0;
}

 dp 是魔鬼 

原文地址:https://www.cnblogs.com/zlrrrr/p/10523794.html