#include<iostream> #include<cstdio> #include<cstring> #define MAXN 60 #define MOD %1000000007 using namespace std; long long r[MAXN][MAXN][15][15];//保存状态 long long map[MAXN][MAXN];//初始地图 long long m,n,num; long long dfs(long long i,long long j,long long k,long long v) { long long s=0,t; if(r[i][j][k][v+1]!=-1) //这个状态到达过 return r[i][j][k][v+1]; if(i==m&&j==n)//到达终点 { if(k==num) //已经拿了K件 { r[m][n][k][v+1]=1; return r[m][n][k][v+1]; } else if(k==num-1&&map[m][n]>v) //拿了K-1件,而且还大于最大值(也就是把最后一个拿了) { r[m][n][k][v+1]=1; return r[m][n][k][v+1]; } else //超过K件,或者少于K-1,或者=k-1,但不大于最大价值。即为不可行方案,返回 0; { r[m][n][k][v+1]=0; return r[m][n][k][v+1]; } } else //分别执行搜索 { if(map[i][j]>v) { t=map[i][j]; if(i+1<=m) s=(s+dfs(i+1,j,k+1,t)MOD+dfs(i+1,j,k,v)MOD)MOD; if(j+1<=n) s=(s+dfs(i,j+1,k+1,t)MOD+dfs(i,j+1,k,v)MOD)MOD; } else { if(i+1<=m) s=(s+dfs(i+1,j,k,v)MOD)MOD; if(j+1<=n) s=(s+dfs(i,j+1,k,v)MOD)MOD; } r[i][j][k][v+1]=s MOD; return r[i][j][k][v+1]; //保存到下一位 } } int main() { memset(r,-1,sizeof(r)); long long i,j,p,q; cin>>m>>n>>num; for(i=1; i<=m; i++) for(j=1; j<=n; j++) cin>>map[i][j]; dfs(1,1,0,-1); cout<<r[1][1][0][0]<<endl; return 0; }