蓝桥杯 历届试题 地宫取宝

我本来想dp的 可惜dp不出来 后来才知道是记忆化搜索
至于那个返回的max_+1是因为 本来返回max_的 但是因为一开始代入dfs的参数是-1
所以就要+1

#include<cstdio>
#include<cstring>
const int mod=1000000007;
int a[51][51];
int dp[51][51][13][13];
int n,m,k;

int dfs(int x,int y,int num,int max_){
 if(dp[x][y][num][max_+1]!=-1)
 return dp[x][y][num][max_+1];
 int sum=0;
 if(x==n&&y==m){
 if(a[x][y]>max_){
 if(num==k||num==k-1)sum++;
 }
 else if(num==k)sum++;
 return dp[x][y][num][max_+1]=sum;
 }
 if(x+1<=n){
 if(a[x][y]>max_){
 sum+=dfs(x+1,y,num+1,a[x][y]);
 if(sum>=mod)sum%=mod;
 }
 sum+=dfs(x+1,y,num,max_);
 if(sum>=mod)sum%=mod;
 }
 if(y+1<=m){
 if(a[x][y]>max_){
 sum+=dfs(x,y+1,num+1,a[x][y]);
 if(sum>=mod)sum%=mod;
 }
 sum+=dfs(x,y+1,num,max_);
 if(sum>=mod)sum%=mod;
 }
 return dp[x][y][num][max_+1]=sum;
}
int main()
{
//    freopen("dg.txt","r",stdin);
 scanf("%d%d%d",&n,&m,&k);
 for(int i=1;i<=n;i++){
 for(int j=1;j<=m;j++){
 scanf("%d",&a[i][j]);
 }
 }
 memset(dp,-1,sizeof(dp));
 printf("%d\n",dfs(1,1,0,-1));
//    for(int i=0;i<51;i++){ // for(int j=0;j<13;j++){ // for(int k=0;k<13;k++){ // dp[i][0][j][k]=dp[0][i][j][k]=1; // } // } // } // for(int i=0;i<51;i++){ // for(int j=0;j<13;j++){ // dp[i][j][0][0]=0; // } // } // dp[0][0][0][0]=1; // for(int i=0;i<=n;i++){ // for(int j=0;j<=m;j++){ // for(int g=0;g<=k;g++){ // for(int l=0;l<=12;l++){ // if(i) // dp[i][j][g][l]+=(dp[i-1][j][g][l]); // if(j) // dp[i][j][g][l]+=dp[i][j-1][g][l]; // if(g) // dp[i][j][g][l]+=(dp[i-1][j][g-1][l]+dp[i][j-1][g-1][l]); // if(l) // dp[i][j][g][l]+=(dp[i-1][j][g][l-1]+dp[i][j-1][g][l-1]); // if(l>a[i-1][j]&&g&&i)
//                        dp[i][j][g][l]+=(dp[i-1][j][g-1][a[i-1][j]]);
//                    if(l>a[i][j-1]&&g&&j)
//                        dp[i][j][g][l]+=(dp[i][j-1][g-1][a[i][j-1]]);
//                    if(dp[i][j][g][l]>=mod)dp[i][j][g][l]%=mod;
//                    printf("%3d ",dp[i][j][g][l]);
//                }
//                printf("\n");
//            }
//        }
//    }
//    int ans=0;
//    for(int i=0;i<=12;i++){ // ans=dp[n][m][k][i]>ans?dp[n][m][k][i]:ans;
//    }
//    printf("%d\n",dp[n][m][k][12]);
 return 0;
}

你可能感兴趣的:(蓝桥杯 历届试题 地宫取宝)