题目描述
分析
Y总经典
集合角度
分析DP:
字丑勿怪
,直接上手写了
Y总视频讲解(需要权限)
实现
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MOD = 1e9 + 7;
const int N = 59;
int n, m, K;
int f[N][N][19][19];
int val[N][N];
int main()
{
cin >> n >> m >> K;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin >> val[i][j];
// 所有物品价值+1, 防止越界(因为题目规定物品价值可以为0, 而不选物品时价值就是-1, 所有数组在状态转移可能越界)
val[i][j] ++;
}
}
f[1][1][0][0] = f[1][1][1][val[1][1]] = 1;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
for(int k=0; k<=K; k++)
{
for(int c=0; c<=13; c++)
{
// 不选(i,j)处物品
f[i][j][k][c] = ( f[i][j][k][c] + f[i-1][j][k][c] ) % MOD;
f[i][j][k][c] = ( f[i][j][k][c] + f[i][j-1][k][c] ) % MOD;
// 选(i,j)处物品
if(c == val[i][j] && k > 0)
{
for(int d=0; d<c; d++)
{
f[i][j][k][c] = (f[i][j][k][c] + f[i-1][j][k-1][d])%MOD;
f[i][j][k][c] = (f[i][j][k][c] + f[i][j-1][k-1][d])%MOD;
}
}
}
}
}
}
int ans = 0;
for(int c=0; c<=13; c++) ans = ( ans + f[n][m][K][c] ) % MOD;
cout << ans << endl;
return 0;
}