• 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];
    
        }
    };
    

    为了自己,和那些爱你的人
  • 相关阅读:
    解决ubuntu不能安装g++的问题
    解决VMware虚拟机不能上网的问题
    打开vmvare出现The VMware Authorization Service is not running。
    word2-寻找社交新浪微博中的目标用户
    新浪云计算SAE部署代码过程
    Python如何调用新浪api接口的问题
    work1-英语辅导班在线报名系统
    Mysql对自增主键ID进行重新排序
    如何使用LIBSVM,从安装到基本实例使用
    laravel怎么创建一个简单的blog
  • 原文地址:https://www.cnblogs.com/zhmlzhml/p/15152482.html
Copyright © 2020-2023  润新知