题目如下:
思路 or 题解:
状态定义:
f
[
i
]
[
j
]
[
n
u
m
]
[
v
]
f[i][j][num][v]
f[i][j][num][v]
[
i
,
j
]
[i,j]
[i,j]位置取了
n
u
m
num
num 个物品 当前物品最大值为
v
v
v
状态转移:
f
[
i
]
[
j
]
[
n
u
m
]
[
v
]
+
=
f
[
i
−
1
]
[
j
]
[
n
u
m
]
[
v
]
+
f
[
i
]
[
j
−
1
]
[
n
u
m
]
[
v
]
f[i][j][num][v] += f[i - 1][j][num][v] + f[i][j - 1][num][v]
f[i][j][num][v]+=f[i−1][j][num][v]+f[i][j−1][num][v]
如果 v > 0 && w[i][j] == v
w
[
i
]
[
j
]
w[i][j]
w[i][j] 是
[
i
,
j
]
[i,j]
[i,j] 位置物品的价值
for (int c = 0; c < v; c++)
{
val = val + f[i - 1][j][num - 1][c];
val = val + f[i][j - 1][num - 1][c];
}
初始化:
为了避免
−
1
-1
−1, 我们把物品的价值都 +1
f
[
1
]
[
1
]
[
1
]
[
w
[
1
]
[
1
]
]
=
1
;
f[1][1][1][w[1][1]] = 1;
f[1][1][1][w[1][1]]=1;
f
[
1
]
[
1
]
[
0
]
[
0
]
=
1
;
f[1][1][0][0] = 1;
f[1][1][0][0]=1;
AC代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <numeric>
#include <cstring>
#include <cmath>
#include <map>
#include <unordered_map>
#include <bitset>
#include <set>
#include <random>
#include <ctime>
#include <queue>
#include <stack>
#include <climits>
#define buff \
ios::sync_with_stdio(false); \
cin.tie(0);
// #define int long long
#define ll long long
#define PII pair<int, int>
#define px first
#define py second
typedef std::mt19937 Random_mt19937;
Random_mt19937 rnd(time(0));
using namespace std;
const int mod = 1e9 + 7;
const int inf = 2147483647;
const int N = 100009;
int n, m, k;
int w[55][55], f[55][55][13][15];
void solve()
{
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> w[i][j], w[i][j]++;
f[1][1][1][w[1][1]] = 1;
f[1][1][0][0] = 1;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (i == 1 && j == 1)
continue;
for (int num = 0; num <= k; num++)
for (int v = 0; v <= 13; v++)
{
int &val = f[i][j][num][v];
val = (val + f[i - 1][j][num][v]) % mod;
val = (val + f[i][j - 1][num][v]) % mod;
if (v > 0 && w[i][j] == v)
{
for (int c = 0; c < v; c++)
{
val = (val + f[i - 1][j][num - 1][c]) % mod;
val = (val + f[i][j - 1][num - 1][c]) % mod;
}
}
}
}
int ans = 0;
for (int i = 0; i <= 13; i++)
ans = (ans + f[n][m][k][i]) % mod;
cout << ans << '\n';
}
int main()
{
buff;
solve();
}