第五届蓝桥杯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\n", dp[1][1][0][0] % mod); return 0; }
dp 是魔鬼