美文网首页
第29章 特殊形式的动态规划

第29章 特殊形式的动态规划

作者: 得力小泡泡 | 来源:发表于2020-04-13 16:07 被阅读0次

1、机器人走方格

算法分析

记忆化搜索

可以知道棋盘中的每个位置走到终点的方案数是固定的,因此搜索过的位置需要进行记录,以免重复搜索,又由于后面的位置的点的结果才能影响到前面的位置的点,因此需要从(0,0)开始进行搜索,往能到达的点进行深度优先搜索

image.png

时间复杂度

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N = 110;
    static int[][] f = new int[N][N];
    static int[][] a = new int[N][N];
    static int n,m;
    static int mod = 10000;
    static int dfs(int x,int y)
    {
        if(f[x][y] != -1) return f[x][y];
        if(x == n && y == m) return f[x][y] = 1;
        int w = a[x][y];
        long cnt = 0;
        for(int i = x;i <= Math.min(x + w,n);i ++)
            for(int j = y;j <= Math.min(y + w, m);j ++)
            {
                if(i == x && j == y) continue;
                if(i - x + j - y > w) continue;
                cnt = (cnt + dfs(i,j)) % mod; 
            }
        return f[x][y] = (int)cnt;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        m = scan.nextInt();
        for(int i = 1;i <= n;i ++)
            for(int j = 1;j <= m;j ++)
                a[i][j] = scan.nextInt();
        for(int i = 1;i <= n;i ++)
            Arrays.fill(f[i], -1);
        System.out.println(dfs(1,1));
    }
}

2、肥肥鼠吃奶酪

算法分析

记忆化搜索

题目分析:站在某个位置,能竖直或者水平移动最多m个格子,且移动的格子的能量一定大于当前格子,因此类似滑雪那题

在每个格子中,从这个格子开始dfs找,找到的能量的最大值是固定的,因此可以用记忆化搜索把当前格子的最大能量记录下来,从(1,1)开始,往可以到达的点继续深度优先搜索

时间复杂度

Java 代码

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N = 110;
    static int[][] f = new int[N][N];
    static int[][] a = new int[N][N];
    static int n,m;
    static int dfs(int x,int y)
    {
        if(f[x][y] != -1) return f[x][y];
        f[x][y] = a[x][y];
        int val = f[x][y];
        for(int i = 1;i <= m;i ++)
        {
            
            if(y - i >= 0 && a[x][y - i] > a[x][y]) val = Math.max(val, dfs(x,y - i) + a[x][y]);
            if(y + i < n && a[x][y + i] > a[x][y]) val = Math.max(val, dfs(x,y + i) + a[x][y]);
            if(x - i >= 0 && a[x - i][y] > a[x][y]) val = Math.max(val, dfs(x - i,y) + a[x][y]);
            if(x + i < n && a[x + i][y] > a[x][y]) val = Math.max(val, dfs(x + i,y) + a[x][y]);
        }
        return f[x][y] = val;
    }
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        m = scan.nextInt();
        for(int i = 0;i < n;i ++)
            for(int j = 0;j < n;j ++)
                a[i][j] = scan.nextInt();
        for(int i = 0;i < n;i ++)
            Arrays.fill(f[i], -1);
        System.out.println(dfs(0,0));
    }
}

相关文章

  • 第29章 特殊形式的动态规划

    1、机器人走方格 算法分析 记忆化搜索 可以知道棋盘中的每个位置走到终点的方案数是固定的,因此搜索过的位置需要进行...

  • 其他来源:数据结构/算法学习笔记

    动态规划问题(Dynamic Programming) 首先,动态规划问题的一般形式就是求最值。动态规划其实是运筹...

  • 算法学习之路:使用最简单的方式给你讲讲动态规划算法

    动态规划算法 动态规划问题的一般形式就是求最值:动态规划是运筹学的一种最优化方法 动态规划的应用场景:求最长递增子...

  • 动态规划入门

    1.什么是动态规划动态规划是在前面已有答案的基础上向下递推的过程 动态规划算法的两种形式上面已经知道动态规划算法的...

  • 算法日记-动态规划法

    如何单独运行js文件: 1.安装node2.在命令窗口中输入 动态规划解题套路框架 动态规划问题的一般形式就是求最...

  • Algorithm进阶计划 -- 动态规划(上)

    动态规划动态规划的基本原理动态规划的运用 1. 动态规划的基本原理 动态规划(Dynamic Programmi...

  • 动态规划

    1.什么是动态规划 背包问题的求最优解的方法,通过网格的形式将问题分解为子问题 2.哪些适用于动态规划 a.背包类...

  • 动态规划 Dynamic Programming

    从运筹学和算法的角度综合介绍动态规划 算法分类总结动态规划与静态规划的关系浅析静态规划和动态规划动态规划解非线性规...

  • 算法3:动态规划

    5.动态规划5.1 什么是动态规划?5.2 自底向上的动态规划:5.3 自顶向下的动态规划5.4 0-1背包问题:...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

网友评论

      本文标题:第29章 特殊形式的动态规划

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