三十九、动态规划——线性DP问题-例题题解

news2024/11/25 7:59:20

线性DP问题的例题状态划分

  • 一、问题:数字三角形
    • 1、题目内容
    • 2、状态划分
      • 1)状态编号 f[i][j]
      • 2)状态划分
    • 3、题解
  • 二、最长上升子序列
    • 1、题目内容
    • 2、状态划分
      • 1)状态编号 f[i]
      • 2)状态划分
    • 3、题解
  • 三、最长公共子序列
    • 1、题目内容
    • 2、状态划分
      • 1)状态编号 f[i][j]
      • 2)状态划分
    • 3、题解

一、问题:数字三角形

1、题目内容

在这里插入图片描述

2、状态划分

1)状态编号 f[i][j]

在这里插入图片描述

2)状态划分

在这里插入图片描述

3、题解

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

public class Main{
    static int N = 510;
    static int INF = (int)(1e9);
    static int[][] a = new int[N][N];
    static int[][] f = new int[N][N];
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        String str1 = in.readLine();
        
        int n = Integer.parseInt(str1);
        
        for(int i = 1; i <= n; i++){
            String[] str2 = in.readLine().split(" ");
            
            for(int j = 1; j <= i; j++){
                a[i][j] = Integer.parseInt(str2[j - 1]);
            }
        }
        
        // 初始化fij
        for(int i = 0; i <= n ; i++){
            for(int j = 0; j <= i + 1; j++){        
            // 此处之所以 j 会遍历到 i + 1 是因为在 j = i的时候
            // a[i][j] 的右上角是没有数值的,但是因为状态转换公式会遍历到右上角,并且不能影响后面的值
            // 因此也需要进行负无穷初始化
                f[i][j] = -INF;
            }
        }
        
        // 初始化第一行数据
        f[1][1] = a[1][1];
        
        for(int i = 2; i <= n; i++){        // 从第二行开始进行状态转换
            for(int j = 1; j <= i; j++){
            // 状态转换方程将集合分成了左上角和右上角的路线来进行处理
                f[i][j] = Math.max(f[i - 1][j - 1] + a[i][j] , f[i - 1][j] + a[i][j]);
            }
        }
        
        int result = -INF;
        
        for(int j = 1; j <= n; j++){        
        // 因为最后有很多个出口可以走,我们需要对最后一行的出口进行数值比较才可以最终得到路径最大值
            result = Math.max(result, f[n][j]);
        }
        
        System.out.println(result);
        
        
        
    }
}

二、最长上升子序列

1、题目内容

在这里插入图片描述

2、状态划分

1)状态编号 f[i]

  • 状态 f[i] 表示其所有以第 i 个数结尾的上升子序列
    在这里插入图片描述

2)状态划分

在这里插入图片描述

3、题解

import java.util.*;

public class Main{
    static int N = 1010;
    static int[] a = new int[N];
    static int[] f = new int[N];
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        
        int n = in.nextInt();
        
        for(int i = 1; i <= n; i++){
            a[i] = in.nextInt();
        }
        
        for(int i = 1; i <= n; i++){
            f[i] = 1;       // f[i]=1是对最长子序列长度做初始化,最小的子序列就是本身,如果需要增加后面的max会进行处理
            for(int j = 1; j < i; j++){
                if(a[j] < a[i]){
                    f[i] = Math.max(f[i], f[j] + 1);    // i 前面的 j 需要需要满足小于条件,然后才可以加入上升子序列长度
                }
            }
        }
        
        int res = 0;
        
        for(int i = 1; i <= n; i++){
            res = Math.max(res, f[i]);      // 找出所有位置中最长的子序列,也就相当于max(max())
        }
        
        System.out.println(res);
        
    }
}

三、最长公共子序列

1、题目内容

在这里插入图片描述

2、状态划分

1)状态编号 f[i][j]

  • f[i][j] 表示所有在第一个序列的第 i 个字母中出现,且在第二个序列的前 j 个子母钟出现的子序列。

2)状态划分

在这里插入图片描述

3、题解

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

public class Main{
    static int N = 1010;
    static int[][] f = new int[N][N];
    
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        String[] str1 = in.readLine().split(" ");
        int n = Integer.parseInt(str1[0]);
        int m = Integer.parseInt(str1[1]);
        
        String aStr = in.readLine();
        String bStr = in.readLine();
        
        char[] a = aStr.toCharArray();
        char[] b = bStr.toCharArray();
        
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                f[i][j] = Math.max(f[i - 1][j], f[i][j - 1]);       
                // ai与bj至少有一个选择加入公共子序列了,也就包括了一个都没有加入子序列
                if(a[i - 1] == b[j - 1]){
                    f[i][j] = Math.max(f[i][j], f[i - 1][j - 1] + 1);       // 两个都加入子序列,则长度加一
                }
            }
        }
        
        System.out.println(f[n][m]);
        

        
    }
}

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

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

相关文章

【二维偏序+双指针】ABC245 E

E - Wrapping Chocolate (atcoder.jp) 题意&#xff1a; 思路&#xff1a; 因为两个数组都是无序的&#xff0c;因此可以考虑给这两个数组都排个序 将物品和盒子都按照两个维度去排序 我们可以先去枚举物品&#xff0c;然后去选对应的盒子 在选盒子的过程中&#xff0c;注…

【王道·操作系统】第四章 文件管理(下)

一、文件系统 1.1 文件系统的层次结构 用户需要通过操作系统提供的接口发出上述请求——用户接口由于用户提供的是文件的存放路径&#xff0c;因此需要操作系统一层一层地查找目录&#xff0c;找到对应的目录项——文件目录系统不同的用户对文件有不同的操作权限&#xff0c;因…

c++读取字符串字符时出错

这是我做的一个c爬虫程序但是在抓取网页的时候string类型传递出现了问题 以下是图片代码 url的值是 "http://desk.zol.com.cn/" 我不知道为什么数据传递会出问题 请大佬指教

Java 串口通信(RS232/485)

Java 串口通信&#xff08;RS232/485&#xff09; 一.串口通信页面二.串口服务实现1.Java 串口通信配置1.扩展包和依赖库2.Pom配置 2.启动类3.工具包类1.Common2.Crc16Modbus3.SerialUtil 4.WebSocket 配置1.启动配置2.监听配置 5.UI交互类1.串口配置对象2.串口信息获取接口3.R…

HOT39-对称二叉树

leetcode原题链接&#xff1a;对称二叉树 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&a…

JVM03-优化垃圾回收

JVM的内存区域中&#xff0c;程序计数器、虚拟机栈和本地方法栈这3个区域是线程私有的&#xff0c;随着线程的创建而创建&#xff0c;销毁而销毁&#xff1b;栈中的栈帧随着方法的进入和退出进行入栈和出栈操作&#xff0c;每个栈帧中分配多少内存基本是在类结构确定下来的时候…

消息中间件面试题详解

RabbitMQ 如何保证消息不丢失 消息的重复消费问题如何解决 rabbitmq中死信交换机&#xff08;RabbitMQ延迟队列有了解吗&#xff09; 延迟队列&#xff1a;进入队列的消息会被延迟消费的队列 场景&#xff1a;超时订单&#xff0c;限时优惠&#xff0c;定时发布 延迟队列 …

【Linux】-第一个小程序(进度条)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 &#x1f389;作者宣言&#xff1a;认真写好每一篇博客 &#x1f38a;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作…

Activiti modoler 整合后报错 TypeError: Cannot read property ‘namespace‘ of undefined

之前在Demo整合过没问题&#xff0c;结果好不容易整合到现在的项目&#xff0c;结果出现成这个鬼样子……问题找了好久&#xff0c;一直以为是SpringSecurity请求限制没放开&#xff0c;所以找SpringSecurity的debug日志&#xff0c;浏览器请求有没有404、500、502等&#xff0…

将OpenAI和ChatGPT模型与LearnDash线上学习平台结合使用

人工智能革命来了&#xff01;&#xff08;以尽可能最好的方式。&#xff09;了解如何使用 Uncanny Automator 通过 OpenAI 和 ChatGPT 模型为您的线上学习和LearnDash LMS提供动力。 当人们听到“人工智能”这个词时&#xff0c;他们往往会想到流氓机器人、无政府状态的机器人…

科技项目验收测试报告包括哪些内容?

科技项目验收测试报告是评估科技项目质量和可靠性的重要文件。通过全面的测试和评估&#xff0c;可以确保项目的质量&#xff0c;提高用户满意度&#xff0c;降低项目风险。 一、科技项目验收测试报告的内容 1. 项目概述&#xff1a;介绍项目的背景、目标和范围&#xff0c;…

从 AI 增强到大模型,企业使用数据的方式又将如何变化?

AI&#xff08;Artificial Intelligence&#xff0c;人工智能&#xff09;的发展不过百年&#xff0c;却已经深刻影响着人们的思维和见解&#xff0c;并逐渐关联到每个人生活和工作的方方面面。从最初的规则引擎和引入统计学方法&#xff0c;到基于知识表示和推理机制的专家系统…

瓴羊QuickBI数据门户帮助企业高效管理和展示数据,使其更加明确易懂

随着信息技术时代的到来&#xff0c;越来越多的企业意识到商业信息是其最宝贵的资产之一。对于获取商业信息&#xff0c;需要专业的数据分析。因此&#xff0c;商业智能BI工具&#xff0c;如瓴羊QuickBI已经成为企业信息化中必不可少的工具。它拥有卓越的数据管理和展示功能&am…

VS2019中WebService实现发布、调用以及问题汇总

VS2019中WebService实现发布、调用以及问题汇总 前言一、WebService是什么&#xff0c;意义有哪些&#xff1f;二、创建二.发布三.访问问题总结1.不是专用连接2.HTTP错误 403.14 - Forbidden3.HTTP 错误 404.3 - Not Found4.应用程序种服务器错误 前言 在对接工厂Mes的过程中&…

图书馆流量监控性能分析案例

前言 图书馆信息中心老师反应&#xff0c;用户反馈系统有访问慢的情况&#xff0c;需要通过流量分析系统来了解图书馆系统的运行情况&#xff0c;此报告专门针对图书馆系统的性能数据做了分析。 图书馆已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史…

springboot 整合mybatis plus,使用druid 切换多数据源实现单数据库事务,附赠项目源码地址

项目源码地址 GitHub - liyanlei58/ssm: springboot druid mybatis plus 事务 最近想搭一套spring cloud开发环境&#xff0c;各种不顺利吧&#xff0c;先是spring cloud的组件某些功能不好用&#xff0c;是版本自身的bug。后来又碰到了事务无法回滚&#xff0c;这个搞了好几个…

银河麒麟服务器v10 sp1 安装mysql

可以先用 dpkg --list|grep mysql 查看自己的mysql有哪些依赖&#xff1a; 上图已经是安装后的截图&#xff0c;然后再卸载 sudo apt-get autoremove --purge mysql-common 本文在没有安装之前&#xff0c;只有mysql-common包&#xff0c;再用dpkg --list|grep mysql查看&…

[MySQL]在搭载Linux系统(centos7)的云服务上安装MySQL

[MySQL]MySQL 在 Centos 7环境安装 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;⼀旦安装&#xff0c;普通用户也能够使用。 文章目录 [MySQL]MySQL 在 Centos 7环境安装1. 卸载不要的环境2. 获取MySQL官方yum源3. 安装mysql yum 源&#xff0c;对比前后yum源4.…

Windows server 下关闭135/139/445端口

一、关闭​ ​135端口​​ 方案一 第一步 运行dcomcnfg&#xff0c;打开“组件服务”→“计算机”&#xff0c;在“我的电脑”上右键点击&#xff0c;选“属性”&#xff1b;然后点默认属性&#xff0c;把“在此计算机上启用分布式COM&#xff08;E&#xff09;”的勾去掉&a…

深入理解Spring Boot:从入门到精通

摘要 Spring Boot是一个用于构建独立、生产级别的Spring应用程序的框架。它以简化配置和快速开发为设计目标&#xff0c;使开发人员能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的核心概念、特性和最佳实践&#xff0c;帮助读者从入门到精通。 引言 在当今的软件开发…