#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<ll,int> pii;
int n,m,k;
int v[52][52];
ll dp[52][52][15][15];///dfs几个变量就开几维
ll mod=1000000000+7;
ll dfs(int x,int y,int c,int ma)
{
if(x==n&&y==m&&c==k) return 1;///符合条件
if(dp[x][y][c][ma+1]!=-1) return dp[x][y][c][ma+1]%mod;///记忆化剪枝
if(x<1||x>n||y<1||y>m||c>k) return 0;///越界或超k
ll w=0,e=0;
if(x+1<=n)///访问数组不越界
{
if(v[x+1][y]>ma)///v大于ma,有两种选择
w=(dfs(x+1,y,c+1,v[x+1][y])+dfs(x+1,y,c,ma))%mod;
else w=dfs(x+1,y,c,ma);///小于只有一种
}
if(y+1<=m)
{
if(v[x][y+1]>ma)
e=(dfs(x,y+1,c+1,v[x][y+1])+dfs(x,y+1,c,ma))%mod;
else e=dfs(x,y+1,c,ma);
}
return dp[x][y][c][ma+1]=(w+e)%mod;///最后return 当前
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>v[i][j];
memset(dp,-1,sizeof(dp));
dfs(1,1,0,-1);///玄妙,因为价值里有0,所以不取初始不能为0
ll w=dp[1][1][0][0]%mod;///ma+1
memset(dp,-1,sizeof(dp));
dfs(1,1,1,v[1][1]);
ll e=(w+dp[1][1][1][v[1][1]+1])%mod;
cout<<e;///两种情况,w=第一个取不 ,另一种使第一个取
return 0;
}
地宫取宝---dfs‘记忆
于 2025-03-18 11:35:08 首次发布