四十一、动态规划——树形DP、记忆化搜索例题题解

news2025/1/13 7:49:01

算法主要内容

  • 一、树形DP
    • 1、题目内容
    • 2、状态划分
      • (1)存储
      • (2)状态集合划分
    • 3、题解
  • 二、记忆化搜索
    • 1、题目内容
    • 2、状态划分
      • (1)状态编号
      • (2)状态划分
    • 3、题解

一、树形DP

1、题目内容

在这里插入图片描述

2、状态划分

(1)存储

  • 用二叉树进行存储
    在这里插入图片描述

(2)状态集合划分

  • f[u][0] :所有人以 u 为根的子树中选,并且不选u这个点的方案。
  • f[u][1] :所有人以 u 为根的子树中选,并且选u这个点的方案。
    在这里插入图片描述
    在这里插入图片描述

3、题解

import java.util.*;
import java.io.*;

public class Main{
    static int N = 6010;
    static int idx = 0;
    static int[] happy = new int[N];
    static int[] h = new int[N];
    static int[] e = new int[N];
    static int[] ne = new int[N];
    static int[][] f = new int[N][2];
    static boolean[] h_father = new boolean[N];
    
    static void add(int a, int b){      // 单链表进行存储,将a接在b的后面
        e[idx] = b;
        ne[idx] = h[a];
        h[a] = idx++;
    }
    
    static void dfs(int u){
        f[u][1] = happy[u];         // 初始化,选择u节点则,则此处值为happy值
        
        for(int i = h[u]; i != -1; i = ne[i]){      // 遍历u节点下面的节点
            int j = e[i];
            dfs(j);                 // dfs进一步求解
            
            f[u][0] = f[u][0] + Math.max(f[j][0] ,f[j][1]);     // 不选择u节点,则u节点总的快乐指数
            f[u][1] = f[u][1] + f[j][0];                        // 选择u节点,则快乐指数为
            // u节点的快乐指数是由下面的节点选择来决定一部分的
        }
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        Arrays.fill(h, - 1);
        
        String str1 = in.readLine();
        int n = Integer.parseInt(str1);
        
        for(int i = 1; i <= n; i++){
            String str2 = in.readLine();
            happy[i] = Integer.parseInt(str2);          // happy节点大小
        }
        
        for(int i = 0; i < n - 1; i++){
            String[] str3 = in.readLine().split(" ");
            int a = Integer.parseInt(str3[0]);
            int b = Integer.parseInt(str3[1]);
            h_father[a] = true;         // 说明a节点有父节点了,还不会停下
            add(b, a);
        }
        
        int root = 1;
        while(h_father[root]){
            root++;             // 整棵树的大小
        }
        
        dfs(root);              // 树的最顶层
        
        System.out.println(Math.max(f[root][0],f[root][1]));        // 选择最顶层的节点进行是否选择的判断
        
    }
}

二、记忆化搜索

1、题目内容

在这里插入图片描述

2、状态划分

(1)状态编号

  • f[i][j]:所有从(i, j)开始滑的路径

(2)状态划分

  • 在满足高低条件情况下,对上下左右进行遍历

在这里插入图片描述

3、题解

import java.util.*;
import java.io.*;

public class Main{
    static int N = 310;
    static int n,m;
    static int[][] h = new int[N][N];
    static int[][] f = new int[N][N];
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    
    static int dp(int x, int y){
        
        if(f[x][y] != -1){
            return f[x][y];
        }
        
        f[x][y] = 1;        
        // 说明还没有算过,需要重新初始化为1,因为最差是遍历自己一遍,也就是自己只滑了自己这一个格子
        
        for(int i = 0; i < 4; i++){
            int a = x + dx[i];  //表示上下左右
            int b = y + dy[i];
            
            if(a >= 1 && a <= n && b >= 1 && b <= m && h[a][b] < h[x][y]){      // 不可以等于,因为必须是低于才可以
                f[x][y] = Math.max(f[x][y], dp(a, b) + 1);      // 寻找 fxy 和 推掉一个点到ab+1之间谁是最大
            }
        }
        
        return f[x][y];
    }
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        String[] str1 = in.readLine().split(" ");
        n = Integer.parseInt(str1[0]);
        m = Integer.parseInt(str1[1]);
        
        for(int i = 0; i < N; i++){
            Arrays.fill(f[i], - 1);        
            // 初始化为 -1 判断是否dp计算过滑雪距离,因为递归的存在,让其可以完美找到最低点
        }
        
        for(int i = 1; i <= n ; i++){
            
            String[] str2 = in.readLine().split(" ");
            for(int j = 1; j <= m; j++){
                h[i][j] = Integer.parseInt(str2[j - 1]);
            }
        }
        
        int res = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                res = Math.max(res, dp(i, j));      // 递归存在,完美找到最低点,然后遍历上来
            }
        }
        
        
        System.out.println(res);

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

瑞芯微:基于RKNN3568得ufldv2部署

Lane检测是自动驾驶和高级驾驶员辅助系统&#xff08;ADAS&#xff09;的基本组成部分&#xff0c;用于区分和定位道路上的车道线。尽管深度学习模型已经取得了巨大成功&#xff0c;但仍有一些重要且具有挑战性的问题需要解决。 第一个问题是效率问题。在实践中&#xff0c;车…

猜猜看!哪张甜甜圈图是真的?AI数字人商业实践「真经」;LangChain X Prem挑战赛;故事绘本生成与盈利平台 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 猜猜看&#xff01;你觉得&#xff0c;哪张甜甜圈的图片是真的&#xff1f; 这是 Reddit网站 Midjourney 子区发起的一项趣味挑战&…

【计算机视觉】对比学习采样器sampler

前置知识准备 Samplers — Open Metric Learning documentation​​​​​​ 在该文档里&#xff0c;category表示类别&#xff0c;label表示商品&#xff0c;instance表示商品不同角度的图片。 category就是blouses_shirts&#xff1b;label就是15&#xff1b;instance就是这…

【设计模式】第十章:组合模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

【数据可视化】SVG(一)

一、邂逅SVG和初体验 什么是SVG  SVG全称为&#xff08;Scalable Vector Graphics&#xff09;&#xff0c;即可缩放矢量图形。&#xff08;矢量定义&#xff1a;既有大小又有方向的量。在物理学中称作矢量&#xff0c;如一个带箭头线段&#xff1a;长度表示大小&#xff0…

(位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

❓ 1356. 根据数字二进制下 1 的数目排序 难度&#xff1a;简单 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同&#xff0c;则必须将它们按照数值大小升序排列。 请你返回排序后的数组。 示…

python flask sqlite http服务

python flask 服务 为了让拼接项目能够简单实用http服务&#xff0c;用python flask 来做一个http服务&#xff0c;使用python的原因是拼接项目本身很多人工智能的服务是用python来写。数据库为了简单实用sqlite&#xff0c;python自带sqlite3 ,很方便 db.sql CREATE TABLE …

AcWing 98. 分形之城

题目链接:AcWing 98. 分形之城 问题描述 分析 这一道题看起来很麻烦&#xff0c;其实就是比较麻烦。 这是一道递归坐标变换的问题&#xff0c;坐标变换比较难想&#xff0c;建议自己动手画一画容易明白一些。 首先是城市等级 n n n 与总点数的关系&#xff0c;不难发现总点数…

golang Redis的新数据类型github.com/go-redis/redis/v8实践

Redis的新数据类型# 在redis中&#xff0c;后面添加了几个比较高级的数据类型 hyperloglog基数统计、GEO存储地理位置、bitmap位图、stream为消息队列设计的数据类型 这 4 种数据类型。 HyperLogLog类型# HyperLogLog简介# HyperLogLog 是一种用于数据统计的集合类型&#x…

亚马逊云科技Zero ETL数据库,助力企业走向数据驱动的业务增长之路

据Forrester研究&#xff0c;相对于数据应用不够成熟的公司&#xff0c;那些有效获取业务洞察的公司&#xff0c;有高达8.5倍的可能性实现至少20%的收入增长。然而&#xff0c;要实现这一增长&#xff0c;需要简化一项流程——在数据分析前管理和准备好数据。这就是为什么亚马逊…

16.电容触摸按键

1.电容触摸按键介绍&#xff1a; R是外接的充电电阻&#xff0c; Cs是没有触摸按下的触摸感应区和四周覆铜区域的一个杂散的电容&#xff1b;当使用手指去触摸感应区时&#xff0c;手指和感应区形成一个电容Cx&#xff0c;开关是电容放电的一个开关&#xff0c;在实际设计中是利…

Ubuntu 22.04.2 LTS LTS x86_64 安装 stable-diffusion-webui 【2】基本版本完结。

前篇 Ubuntu 20.04 LTS x86_64 安装 stable-diffusion-webui_hkNaruto的博客-CSDN博客 内容太多&#xff0c;分第二篇继续 中途重装了机器&#xff0c;20.04 &#xff0c;apt upgrade后自动升级到22.04.2 现状&#xff1a;起来了&#xff0c;又没完全起来 启动日志 (stab…

如何在 Linux 中将本地网络 IP 设置为静态的

文章目录 对于普通的 Linux 操作系统对于 Red Hat Enterprise Linux 9 笔者的运行环境&#xff1a; CentOS 8 Red Hat Enterprise Linux 9 在 Linux 中将本地网络 IP 设置为静态的&#xff0c;只需要在那台 Linux 上设置即可。为了方便&#xff0c;这里笔者使用了 Xshell 来远…

手写操作系统--主引导扇区以及内核加载器

在CPU上电后&#xff0c;会自动将cs:ip置为f000:fff0,下图就是一个计算机刚上电的模拟&#xff1a; ffff00这里开始的代码是BIOS自检&#xff0c;检查计算机的硬件完备性&#xff0c;做完这一切后将第一个扇区的内容复制到0x7c00的位置&#xff0c;并从0x7c00位置执行代码&…

第五章 逻辑回归

第五章 逻辑回归 Logistic回归的⼀般过程 收集数据&#xff1a;采⽤任意⽅法收集数据。准备数据&#xff1a;由于需要进⾏距离计算&#xff0c;因此要求数据类型为数值型。另外&#xff0c;结构化数据格式则最佳。分析数据&#xff1a;采⽤任意⽅法对数据进⾏分析。训练算法&…

Golang每日一练(leetDay0118) 扁平化嵌套列表迭代器、整数拆分

目录 341. 扁平化嵌套列表迭代器 Flatten Nested List Iterator &#x1f31f;&#x1f31f; 343. 整数拆分 Integer Break &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/…

vscode工作区实现机制

工作区是编辑器的重要部分&#xff0c;它承载着编辑器和本地文件的连接&#xff0c;对文件增、删、改、查。下面我会介绍vscode工作区的创建。同样我们知道vscode软件打开的时候没有默认工作区&#xff0c;这里我对它进行了改造&#xff0c;软件启动时指向默认工作区。 工作区目…

提高腾讯QQ(电脑版)语音通话、视频聊天和远程协助的稳定性的方法

一、背景说明 腾讯QQ默认使用的通讯协议是UDP。但是各大运营商将UDP的优先级设置为最低&#xff0c;导致UDP数据包经常被丢弃。导致腾讯QQ在语音通话、视频聊天和远程协助的时候&#xff0c;会出现连接不上、卡顿和断线&#xff0c;非常不稳定。我们可以手动将通讯协议调整为TC…

用Python实现自动化交易:从趋势到收益

在现代金融市场中&#xff0c;自动化交易已经成为越来越流行的一种方式。相比于传统的手工交易方式&#xff0c;自动化交易更加高效、精准、快速且免除了人为因素的影响。而Python作为一种高级编程语言&#xff0c;凭借其简单易学、灵活性强的优势逐渐成为自动化交易中最受欢迎…

Ubuntu下Go语言TCP广播服务器实现

最近在学习Go语言网络编程&#xff0c;突然想到很久以前的用C语言写过的TCP广播聊天程序&#xff0c;然后就用Go尝试写了一遍&#xff0c;在此做个记录。 目录 1.广播结构 2.实现效果 3.源码 4.Go语言学习参考网站 1.广播结构 2.实现效果 服务器&#xff1a; 客户端1&…