记忆化dfs
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,m,k; int mp[55][55]; long long int vis[55][55][15][15]; const int inf=1000000007; int dfs(int x,int y,int st,int maxn) { long long s=0; if (vis[x][y][st][maxn+1]!=-1) return vis[x][y][st][maxn+1]; //因为下标不能为-1,所以所有的第4下标都加1 if (x==n && y==m) { if (st==k || (st==k-1 && mp[n][m]>maxn)) return vis[x][y][st][maxn+1]=1; else return vis[x][y][st][maxn+1]=0; } if (x<n) { if (mp[x][y]>maxn) s+=dfs(x+1,y,st+1,mp[x][y])%inf; s+=dfs(x+1,y,st,maxn)%inf; } if (y<m) { if (mp[x][y]>maxn) s+=dfs(x,y+1,st+1,mp[x][y])%inf; s+=dfs(x,y+1,st,maxn)%inf; } return vis[x][y][st][maxn+1]=s%inf; } int main() { scanf ("%d%d%d",&n,&m,&k); for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) scanf ("%d",&mp[i][j]); } memset(vis,-1,sizeof(vis)); printf ("%d\n",dfs(1,1,0,-1)); //因为价值可能为0,所以初定义宝物最大价值为-1 return 0; }