当前位置: 首页 > article >正文

动态规划习题其七【力扣】【算法学习day.29】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.统计放置房子的方式数

题目链接:2320. 统计放置房子的方式数 - 力扣(LeetCode)

题面:

代码:

class Solution {
    int mod = 1000000007;
    long[] arr;
    public int countHousePlacements(int n) {
        arr = new long[n+1];
        Arrays.fill(arr,-1);
       long ans = recursion(n);
       return (int)((ans*ans)%mod);
    }
    public long recursion(int n){
        if(n<=0)return 1;
        if(arr[n]!=-1)return arr[n];
        return arr[n] =(recursion(n-1)%mod+recursion(n-2)%mod)%mod;
    }
}

2.打家劫舍II

题目链接:213. 打家劫舍 II - 力扣(LeetCode)

题面:

代码:

class Solution {
    int[] arr;
    int[] brr;
    int[] nums;
    int n;
    public int rob(int[] nums) {
        if(nums.length==1)return nums[0];
        this.nums = nums;
         n = nums.length;
        arr = new int[n+1];
        brr = new int[n+1];
        Arrays.fill(arr,-1);
        Arrays.fill(brr,-1);
        return Math.max(recursion(n-1),recursion2(n-1));
    }
    public int recursion(int i){
        if(i<0)return 0;
        if(arr[i]!=-1)return arr[i];
        if(i==n-1)return recursion(i-1);
        return arr[i] = Math.max(recursion(i-1),recursion(i-2)+nums[i]);
    }
     public int recursion2(int i){
        if(i<=0)return 0;
        if(brr[i]!=-1)return brr[i];
        if(i==n-1)return recursion2(i-2)+nums[i];
        return brr[i] = Math.max(recursion2(i-1),recursion2(i-2)+nums[i]);
    }
}

3.施咒的最大总伤害

题目链接:3186. 施咒的最大总伤害 - 力扣(LeetCode)

题面:

代码:

class Solution {
    public long maximumTotalDamage(int[] power) {
        Map<Integer, Integer> cnt = new HashMap<>();
        for (int x : power) {
            cnt.merge(x, 1, Integer::sum);
        }

        int n = cnt.size();
        int[] a = new int[n];
        int k = 0;
        for (int x : cnt.keySet()) {
            a[k++] = x;
        }
        Arrays.sort(a);

        long[] memo = new long[n];
        Arrays.fill(memo, -1);
        return dfs(a, cnt, memo, n - 1);
    }

    private long dfs(int[] a, Map<Integer, Integer> cnt, long[] memo, int i) {
        if (i < 0) {
            return 0;
        }
        if (memo[i] != -1) {
            return memo[i];
        }
        int x = a[i];
        int j = i;
        while (j > 0 && a[j - 1] >= x - 2) {
            j--;
        }
        return memo[i] = Math.max(dfs(a, cnt, memo, i - 1), dfs(a, cnt, memo, j - 1) + (long) x * cnt.get(x));
    }
}

后言

上面是动态规划的部分习题,下一篇会有其他习题,希望有所帮助,一同进步,共勉!


http://www.kler.cn/a/391037.html

相关文章:

  • java模拟键盘实现selenium上下左右键 table中的左右滚动条实现滚动
  • 第74期 | GPTSecurity周报
  • 【深圳大学】数据结构A+攻略(计软版)
  • 【AI大模型】ELMo模型介绍:深度理解语言模型的嵌入艺术
  • RT-DETR融合CVPR[2020]轻量化卷积模块Ghost Module模块
  • 前端 JS面向对象 原型 prototype
  • 力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
  • How to use ffmpeg to convert video format from .webm to .mp4
  • 低轨卫星互联网(二)—— 技术篇
  • 《青牛科技 GC6236:驱动芯片的卓越之选,重塑 IPcamera 和云台控制(替代 BU24036/ROHM)》
  • 第16章 SELECT 底层执行原理
  • linux详解,基本网络枚举
  • Golang | Leetcode Golang题解之第547题身份数量
  • 技术总结(二十五)
  • Spring Boot框架:计算机课程管理的工程认证之桥
  • 【数据管理】DAMA-数据建模和设计
  • Ollama服务以监听0.0.0.0地址
  • 剑指offer JZ33 二叉搜索树的后序遍历序列
  • 「QT」QT5程序设计专栏目录
  • 深入剖析输入URL按下回车,浏览器做了什么
  • jmeter常用配置元件介绍总结之后置处理器
  • 力扣 LeetCode 19. 删除链表的倒数第N个结点(Day2:链表)
  • FFmpeg存放压缩后的音视频数据的结构体:AVPacket简介,结构体,函数
  • Oracle Or子句
  • 网络安全名词解释
  • FPGA 第二讲 初始FPGA