美文网首页
第17章 深搜的剪枝策略

第17章 深搜的剪枝策略

作者: 得力小泡泡 | 来源:发表于2020-04-03 15:42 被阅读0次

1、找数字

算法分析

枚举每个位置选0还是选1,若长度超过19,则break
注意:第一个位置一定选1,其中dfs(num,cnt,len)num该参数可以去掉,cnt必须用弄类型,long的最大值有19

时间复杂度O(2^n)

import java.util.Scanner;

public class Main {
    static int n;
    static long ans = Long.MAX_VALUE;
    static void dfs(int num,long cnt,int len)
    {
        if(len >= 19) 
        {
            return;
        }
        if(cnt % n == 0) 
        {
            ans = Math.min(ans, cnt); 
            return;
        }
                //选0
        dfs(0,cnt * 10,len + 1);
        //选1
        dfs(1,cnt * 10 + 1,len + 1);
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        
        dfs(1,1,1);
        System.out.println(ans);
    }
}

2、Betsy的旅行

算法分析

image.png

从该点出发,往四周进行深度优先搜索,搜索过程中,并记录当前走了多少步,若最后一步已经到达,并且还是在左下角,则ans++

由于该题目数据过小,直接搜索会卡一个数据,超时,因此使用打表的方法直接输出,把17的结果全部存起来,当n == 7时,会跑个4分钟左右,就懒得剪枝了hh

时间复杂度

时间复杂度不好分析

Java 代码

import java.util.Scanner;

public class Main {
    static int N = 9;
    static int n;
    static int ans = 0;
    static int[] dx = new int[] {0,-1,0,1};
    static int[] dy = new int[] {-1,0,1,0};
    static int nums;//总方格数
    static boolean[][] st = new boolean[N][N];
    static void dfs(int x,int y,int cnt)
    {
        if(cnt == nums)
        {
            if(x == n - 1 && y == 0) ans ++;
            return;
        }
        for(int i = 0;i < 4;i ++)
        {
            int a = x + dx[i];
            int b = y + dy[i];
            if(a < 0 || a >= n || b < 0 || b >= n) continue;
            if(st[a][b]) continue;
            st[a][b] = true;
            dfs(a,b,cnt + 1);
            st[a][b] = false;
        }
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        nums = n * n;
        st[0][0] = true;
        dfs(0,0,1);
        System.out.println(ans);
    }
}

Java代码 最终版

import java.util.Scanner;

public class Main {
    static int[] ans = new int[] {0,1,1,2,8,86,1770,88418};
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        System.out.println(ans[n]);
    }
}

相关文章

  • 第17章 深搜的剪枝策略

    1、找数字 算法分析 枚举每个位置选0还是选1,若长度超过19,则break注意:第一个位置一定选1,其中dfs(...

  • 邮局(深搜+剪枝)

    题目如下: 这道题使用的方法是剪枝+深搜。解题步骤在于:先设定一个邮局是已确定的,得出所有的村民到该邮局的距离。再...

  • 深度搜索与回溯

    深度搜索与回溯法的区别 回溯法 = 深搜 + 剪枝。一般大家用深搜时,或多或少都会剪枝。深搜一般用递归实现,比较简...

  • Leetcode-140-Word Break II

    这种搜索的题目直接上深搜90%都能AC,不过这题属于剩下那10%,39个数据点有8个都TLE了,看来需要剪枝策略,...

  • 分配人员(深搜剪枝版)

    问题描述 有N个景点和N个导游,每个导游对每个景点熟悉程度不同,一个景点只需一个导游。求最大熟悉度。(0<=N<=...

  • 分配人员(深搜未剪枝版)

    题目描述 有n个人从事n项工作,每个人只能从事一项,程序读入他们做每个工作的效益,求最佳安排使效益最高 输入文件 ...

  • 决策树的剪枝、连续与缺失

    剪枝处理 剪枝是决策树学习算法对付“过拟合”的主要手段。剪枝的基本策略有预剪枝和后剪枝两种。预剪枝是指在决策树生成...

  • 浅析决策树的生长和剪枝

    摘要:决策树剪枝策略:先剪枝、后剪枝,用于解决过拟合问题。 本文分享自华为云社区《浅析决策树的生长和剪枝[http...

  • leetcode算法题解(Java版)-16-动态规划(单词包含

    摘要: 碰到二叉树的问题,差不多就是深搜、广搜,递归那方面想想了,当然如果要考虑一下空间、时间,还需要进行剪枝和压...

  • 决策树

    1、熵:定义为信息的期望值。表示随机变量不确定性的度量。 5、决策树剪枝策略预剪枝:边建立决策树边进行剪枝的操作(...

网友评论

      本文标题:第17章 深搜的剪枝策略

      本文链接:https://www.haomeiwen.com/subject/dualuhtx.html