zoukankan      html  css  js  c++  java
  • 1575. 统计所有可行路径leetcode (dfs+记忆化搜索 转 dp)

    题目链接

    这个题,先来一个裸dfs看看能骗几分:

    class Solution {
    public:
        long long num=0;
        void dfs(vector<int>& locations, int start,int pre, int finish, int fuel ){
            if(fuel < 0){
                return ;
            }
            if(start==finish){
                num++;
                num=num%(1000000007);
                return ;
            }
            int len=locations.size();
            for (int i = 0; i < len; ++i) {
                if(i!=start){
                    dfs(locations,i,start,finish,fuel-abs(locations[i] - locations[start]));
                }
    
            }
        }
        int countRoutes(vector<int>& locations, int start, int finish, int fuel) {
            dfs( locations,  start, -1, finish,  fuel);
            return num;
        }
    };
    

    诶呀呀,怎么才过了三个测试样例。,,

    其实想想也是,如果fuel一多,这不就直接爆炸,跑过来跑过去的,飘了~~~~

    那再考虑一下的话就是,当油量和所在位置一样的时候,其实路径是一样的,我们可以记录一下的嘛(dfs+记忆化搜索)

    注意一个点,就是它就算到了终点也只是把结果+1而已,根本不需要return

    class Solution {
    public:
        int num=0;
        vector<int> lujing;
        int mem[250][250];
        int dfs(vector<int>& locations, int now, int finish, int fuel ){
            if(fuel < 0){
                return 0;
            }
            if(mem[now][fuel]!=-1){
                return mem[now][fuel];
            }
            mem[now][fuel]=0;
            if(now==finish){
                mem[now][fuel]+=1;
                mem[now][fuel]%=1000000007;
    
            }
            int len=locations.size();
            for (int i = 0; i < len; ++i) {
                int diff=abs(locations[i] - locations[now]);
                if(i!=now && diff<=fuel){
                    mem[now][fuel]+=dfs(locations,i,finish,fuel-abs(locations[i] - locations[now]));
                    mem[now][fuel]%=1000000007;
    
                }
    
            }
            return mem[now][fuel];
        }
        int countRoutes(vector<int>& locations, int start, int finish, int fuel) {
            memset(mem,-1,sizeof(mem));
            return dfs( locations,  start,  finish,  fuel);
        }
    };
    

    昂,其实这样就过了

    但是!!!据说记忆化搜索都可以变成dp,那为什么不,,,问一下神奇海螺呢?

    其实这个时候我们的dp数组都已经出来了。就是刚刚dfs的时候用的那个数组,现在我们要做的是,根据dfs代码把他变成一个dp的解法。

    第一维没有明确的大小关系,但是第二维油量,要求大油量依赖小油量,所以这一维应该是从低枚举的。

    class Solution {
    public:
        int countRoutes(vector<int>& locations, int start, int finish, int fuel) {
            int mem[250][250]={0};
            int len=locations.size();
            memset(mem,-1,sizeof(mem));
            for (int i = 0; i <= fuel ; ++i) {
                mem[finish][i]=1;//这个是边界条件
    
            }
            for (int i = 0; i <= fuel ; ++i) {
                for (int j = 0; j < len; ++j) {
                    for (int k = 0; k < len; ++k) {
                        if(j!=k) {
                            int need = abs(locations[j]-locations[k]);
                            if(i>=need){
                                mem[k][i]+=mem[j][i-need];//注意这个地方,mem[k]才是你要更新的
                                mem[k][i]%=1000000007;
                            }
                        }
    
                    }
    
                }
    
            }
            return mem[start][fuel];
    
        }
    };
    

    为了自己,和那些爱你的人
  • 相关阅读:
    Data Base mysql备份与恢复
    java 乱码问题解决方案
    【知识强化】第二章 物理层 2.1 通信基础
    【知识强化】第二章 进程管理 2.2 处理机调度
    【知识强化】第二章 进程管理 2.1 进程与线程
    【知识强化】第一章 操作系统概述 1.3 操作系统的运行环境
    【知识强化】第一章 网络体系结构 1.1 数据结构的基本概念
    【知识强化】第一章 网络体系结构 1.2 计算机网络体系结构与参考模型
    【知识强化】第一章 网络体系结构 1.1 计算机网络概述
    【知识强化】第一章 操作系统概述 1.1 操作系统的基本概念
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/15152482.html
Copyright © 2011-2022 走看看