题目
题意是从左上角只能往右往下走到右下角,只能拾起比目前有的每个宝藏的价值高的物品,问到达右下角拾起k个的方案数
#include<iostream>
using namespace std;
const int N=55;
int dp[N][N][N][N];
int a[N][N];
int n,m,k1;
const int mod=1e9+7; int main()
{
cin>>n>>m>>k1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
a[i][j]++;//让每个点价值加一,因为价值会有0存在,遇到价值为0的初始点,dp数组的初始值会出错。
}
dp[1][1][0][0]=1; dp[1][1][1][a[1][1]]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(i==1&&j==1) continue;
for(int k=0;k<=k1;k++)
for(int v=0;v<=13;v++)
{
int &val=dp[i][j][k][v];
val=(val+dp[i-1][j][k][v])%mod;
val=(val+dp[i][j-1][k][v])%mod; if(a[i][j]==v&&k>0)
{
for(int c=0;c<v;c++)
{
val=(val+dp[i-1][j][k-1][c])%mod;
val=(val+dp[i][j-1][k-1][c])%mod;
}
}
}}
int ans=0;
for(int i=0;i<=13;i++)
ans=(ans+dp[n][m][k1][i])%mod;
printf("%d\n",ans);
return 0;
}