记忆话题搜索 蓝桥杯 地宫寻宝

所谓记忆化搜索 就是在搜索的基础上对一些状态进行记录 下次同样状态访问的时候 就不需要重复计算了 典型的空间换取时间的套路

有几点要注意的就是这个东西的使用范围 我个人的感觉是要分析清楚状态转移的过程 这道题目里面的状态分析就有很多子问题是有重复 记忆化搜索是有一定动态规划思想的 巧妙的结合 我们知道 动态规划是要遍历所有情况的 如果用动态规划求解这道题目 势必是要超时的

#include<iostream>

#include<string.h>
using namespace std;
long long dp[60][60][15][15];
int map[60][60];
int k,N,M;
void dfs(int n,int m,int k1,int c){
    if(dp[n][m][k1][c]!=-1) return;
    dp[n][m][k1][c]=0;
    if(k1==k&&n==N&&m==M) dp[n][m][k1][c]=1;
    if(map[n][m]>c&&k1<k){
        dfs(n,m,k1+1,map[n][m]);dp[n][m][k1][c]+=dp[n][m][k1+1][map[n][m]];
        dp[n][m][k1][c]%=1000000007;
    }
    if(n<N) {
        dfs(n+1,m,k1,c);dp[n][m][k1][c]+=dp[n+1][m][k1][c];
        dp[n][m][k1][c]%=1000000007;
    }
    if(m<M){
        dfs(n,m+1,k1,c);dp[n][m][k1][c]+=dp[n][m+1][k1][c];
        dp[n][m][k1][c]%=1000000007;
    }
}
int main(){
    cin>>N>>M>>k;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=M;j++){
            cin>>map[i][j];map[i][j]++;
        }
    }
    memset(dp,-1,sizeof(dp));
    dfs(1,1,0,0);
    cout<<dp[1][1][0][0]<<endl;
    return 0;
}

 

posted @ 2017-02-21 10:26  猪突猛进!!!  阅读(250)  评论(0编辑  收藏  举报