记录一下状态就不会超时。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N 1000000007 int n,m,k; int map[55][55],dp[55][55][110][15]; int dfs(int x,int y,int num,int v)//坐标,当前手里的宝贝数量,当前手里最大的 { if(dp[x][y][num][v]!=-1) return dp[x][y][num][v]; if(x==n-1&&y==m-1) { if(num==k||(num==k-1&&map[x][y]>v)) return dp[x][y][num][v]=1; return dp[x][y][num][v]=0; } int ans=0; //右边走 if(x<n-1) { if(map[x][y]>v) ans=(ans+dfs(x+1,y,num+1,map[x][y]))%N; ans=(ans+dfs(x+1,y,num,v))%N; } //下面走 if(y<m-1) { if(map[x][y]>v) ans=(ans+dfs(x,y+1,num+1,map[x][y]))%N; ans=(ans+dfs(x,y+1,num,v))%N; } return dp[x][y][num][v]=ans%N; } int main() { memset(dp,-1,sizeof(dp)); scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { scanf("%d",&map[i][j]); map[i][j]++;//++是因为有的宝贝价值为0,默认初始价值也为0,不能比 } printf("%d\n",dfs(0,0,0,0)); return 0; }