zoukankan      html  css  js  c++  java
  • 记忆话题搜索 蓝桥杯 地宫寻宝

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

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

    #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;
    }
  • 相关阅读:
    P2813 母舰
    P5367 【模板】康托展开
    P1816 忠诚
    P3865 【模板】ST表
    P1913 L国的战斗之伞兵
    P4939 Agent2
    P1894 [USACO4.2]完美的牛栏The Perfect Stall
    P5017 摆渡车
    P1330 封锁阳光大学
    P5018 对称二叉树
  • 原文地址:https://www.cnblogs.com/z1141000271/p/6422836.html
Copyright © 2011-2022 走看看