题目
题意是从左上角只能往右往下走到右下角,只能拾起比目前有的每个宝藏的价值高的物品,问到达右下角拾起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;
}