蓝桥——地宫寻宝(dfs递归 动态规划)**

题目:

dfs穷举递归:

#include<iostream>
using namespace std;

const int MOD=1000000007;
int n,m,k;
int data[50][50];
long long ans;
void dfs(int x,int y,int max,int cnt){
     if(x==n||y==m||cnt>k)return;//"cnt>k"剪枝 
     
     int cur=data[x][y];
     if(x==n-1&&y==n-1)//在最后一个格子
     {
         if(cnt==k||(cnt==k-1&&cur>max)){
         ans++;
         if(ans>MOD){
             ans%=MOD;
         }
     } 
     
     if(cur>max){//可以取这个物品 
         dfs(x,y+1,cur,cnt+1);
         dfs(x+1,y,cur,cnt+1);
     }
     //对于价值较小,或者价值大但是不取物品的情况
     dfs(x,y+1,max,cnt);
     dfs(x+1,y,max,cnt); 
}

int main(){
cin>>n>>m>>k;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>data[i][j];
        }
    }
    
dfs(0,0,-1,0); 
    cout<<ans;
    return 0;
}

动态规划:

 

#include<iostream>
#include<cstring>
using namespace std;

const int MOD=1000000007;
int n,m,k;
int data[50][50];
long long ans;
long long cache[50][50][14][13];

long long dfs2(int x,int y,int max,int cnt){
     //查缓存
     if(cache[x][y][max+1][cnt]!=-1)
         return cache[x][y][max+1][cnt];
    
     long long ans=0;
     int cur=data[x][y];
     
     if(x==n||y==m||cnt>k)return 0;//"cnt>k"剪枝 
    
     if(x==n-1&&y==m-1)//在最后一个格子
     {
         if(cnt==k||(cnt==k-1&&cur>max)){
         ans++;
         if(ans>MOD){
             ans%=MOD;
         }
         return ans;
     } 
    }
     if(cur>max){//可以取这个物品 
         ans+=dfs2(x,y+1,cur,cnt+1);
         ans+=dfs2(x+1,y,cur,cnt+1);
     }
     //价值较小 或者价值较大但是不取
     ans+=dfs2(x,y+1,max,cnt);
     ans+=dfs2(x+1,y,max,cnt); 
     
     cache[x][y][max+1][cnt]=ans%MOD;
     return ans%MOD;
}


int main(){
cin>>n>>m>>k;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>data[i][j];
        }
    }
    memset(cache,-1,sizeof(cache));
    cout<<dfs2(0,0,-1,0);
    return 0;
}

结果正确,不贴了

posted @ 2019-03-10 17:56  Kiss_the_rain  阅读(279)  评论(0编辑  收藏  举报