坑:虽然k>1 但是中间需要计算不同位置的背包里一件物品都没有的状态数量,所以下标c应该从0开始
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
const int Mod = 1000000007;
int dp[N][N][15][15];
int a[N][N];
int n,m,k;
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
dp[1][1][0][0]=1;
dp[1][1][a[1][1]][1]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int v=0;v<=12;v++){
for(int c=0;c<=12;c++){
int& val = dp[i][j][v][c]; // 在(i,j)位置,背包里最大价值为v且总共有c件物品
val = (val + dp[i-1][j][v][c])%Mod; // 不取
val = (val + dp[i][j-1][v][c])%Mod;
if(a[i][j]==v&&c>=1){ // 取
for(int u=0;u<v;u++){
val = (val + dp[i-1][j][u][c-1])%Mod;
val = (val + dp[i][j-1][u][c-1])%Mod;
}
if(v==0&&c==1){// 特判取第一件物品且第一件物品的价值为0的情况
val = (val + dp[i-1][j][0][c-1])%Mod;
val = (val + dp[i][j-1][0][c-1])%Mod;
}
}
}
}
}
}
int res = 0;
for(int i=0;i<=12;i++){
res = (res + dp[n][m][i][k])%Mod;
}
cout<<res<<endl;
return 0;
}