題目鏈接:
http://lx.lanqiao.cn/problem.page?gpid=T120
思路:
1.記爲走到座標爲位置後,手上有件物品且所有物品中最大值爲的方案數;
2.假設我們現在從走到(這兩個位置相鄰),記是處在座標爲的物品的價值,那麼到可以選擇不取該位置的物品,如果該位置物品大於處物品的最大值、那麼也可以選擇取此處的物品;
複雜度
代碼:
#include<bits/stdc++.h>
using namespace std;
const int mod = 1000000007;
int n, m, k, v[55][55];
int dp[55][55][15][15];
#define f(a, b) a = (a + b) % mod;
inline void check(int a, int b, int & x, int & y) {
if(a <= 0 || b <= 0) return;
for(int i = 0; i <= k; i++) {
for(int j = 0; j <= 13; j++) {
f(dp[x][y][i][j], dp[a][b][i][j]);
if(v[x][y] > j) f(dp[x][y][i + 1][v[x][y]], dp[a][b][i][j]);
}
}
}
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
scanf("%d %d %d", &n, &m, &k);
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
scanf("%d", &v[i][j]);
++v[i][j];
}
}
dp[1][1][0][0] = 1;
dp[1][1][1][v[1][1]] = 1;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
check(i - 1, j, i, j);
check(i, j - 1, i, j);
}
}
int ans = 0;
for(int i = 1; i <= 13; i++) f(ans, dp[n][m][k][i]);
printf("%d", ans);
return 0;
}