简单线性Dp

news2024/11/15 13:56:47

文章目录

  • 线性Dp的定义
  • AcWing 898. 数字三角形
    • 思路
    • CODE
      • 正序
      • 倒序
  • AcWing 895. 最长上升子序列
    • Dp 分析
    • CODE
  • AcWing 897. 最长公共子序列
    • Dp 分析
    • CODE



线性Dp的定义

处理起来是线性的(???),这部分交给ai老先生解释:



AcWing 898. 数字三角形

题目链接:https://www.acwing.com/activity/content/problem/content/1002/


思路

正序Dp:

  • 状态表示f[i][j]
    • 集合:表示的是到第 i i i行第 j j j列的数的路径和的集合。
    • 属性:Max最大值
  • 状态计算:
    • 我们发现f[i][j]是由上一层的相邻两个数取最大值决定的,那么有方程: f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j − 1 ] , f [ i − 1 ] [ j ] ) + a [ i ] [ j ] f[i][j] = max(f[i - 1][j - 1], f[i - 1][j]) + a[i][j] f[i][j]=max(f[i1][j1],f[i1][j])+a[i][j]

逆序Dp:

  • 状态计算:
    • 是由下面两个相邻的数的最大值来决定的,倒着算即可。

CODE

正序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 510, INF = 0x3f3f3f3f;

int n, a[N][N];

int main(){
    cin >> n;
    for(int i = 0; i <= n; ++i)
        for(int j = 0; j <= i + 1; ++j)
            a[i][j] = -INF;
    
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= i; ++j)
            cin >> a[i][j];
            
    for(int i = 2; i <= n; ++i)
        for(int j = 1; j <= i; ++j){
            a[i][j] = a[i][j] + max(a[i - 1][j], a[i - 1][j - 1]);
        }
    int res = -INF;
    for(int j = 1; j <= n; ++j) res = max(res, a[n][j]);
    cout << res << endl;
}

倒序

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 520, INF = 0x3f3f3f3f;

int n, a[N][N];

int main(){
    cin >> n;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= i; ++j)
            cin >> a[i][j];
            
    for(int i = n - 1; i >= 1; --i)
        for(int j = 1; j <= i; ++j)
            a[i][j] = max(a[i + 1][j], a[i + 1][j + 1]) + a[i][j];
            
    cout << a[1][1] << endl;
}


AcWing 895. 最长上升子序列

题目链接:https://www.acwing.com/activity/content/problem/content/1003/


Dp 分析

  • 状态表示f[i]
    • 集合:在集合 [ 1 , i ] [1, i] [1,i] 之间的最长上升子序列的长度。
    • 属性:Max
  • 状态计算:
    • 可以从哪些状态迁移过来:
      • 在这个区间内的序列长度,即f[k]
    • 每个迁移状态怎么取值:
      • 如果a[i] > a[k]f[i] = f[k] + 1
      • 如果a[i] <= a[k]f[i] = f[k]
      • 最后取最大值即可。

CODE

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1024, INF = 0x3f3f3f3f; // 定义常量N和INF
int s[N]; // 定义数组s,用于存储输入的序列
int f[N]; // 定义数组f,用于存储以每个元素结尾的最长递增子序列的长度

int main()
{
    int n; // 定义变量n,表示序列的长度
    scanf("%d", &n); // 输入序列的长度
    
    for(int i = 1; i <= n; ++i) scanf("%d", &s[i]); // 输入序列的元素
    
    for(int i = 1; i <= n; ++i) f[i] = 1; // 初始化数组f,每个元素的初始值为1
    
    // 动态规划求解最长递增子序列
    for(int i = 2; i <= n; ++i)
        for(int j = 1; j <= i; ++j)
            f[i] = max(f[i], (s[j] < s[i] ? (f[j] + 1) : 1));
           
    int ans = -INF; // 定义变量ans,用于存储最长递增子序列的长度
    for(int i = 1; i <= n; ++i) ans = max(ans, f[i]); // 找出最长递增子序列的长度
    cout << ans << endl; // 输出最长递增子序列的长度
}


AcWing 897. 最长公共子序列

题目链接:https://www.acwing.com/activity/content/problem/content/1005/


Dp 分析

  • 状态表示f[i][j]
    • 集合:表示对 A A A 序列的前 i i i 个字母和 B B B 序列的前 j j j 个字母所包含的最大公共子序列长度。
    • 属性:Max
  • 状态计算:
    • 集合划分:第 i i i 个和第 j j j 个字母是否相同。
      • 相同:f[i][j] = f[i - 1][j - 1] + 1
      • 不同:f[i][j] = max(f[i - 1][j], f[i][j - 1])
        • i − 1 i - 1 i1 个字母与前 j j j 个字母的最大公共子序列。
        • i i i 个字母与前 j − 1 j - 1 j1 个字母的最大公共子序列。

CODE

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1024; // 定义常量N
int f[N][N]; 	// 定义二维数组f,用于存储最长公共子序列的长度
char a[N], b[N]; // 定义字符数组a和b,用于存储输入的两个字符串

int main()
{
    int n, m; 	// 定义变量n和m,表示两个字符串的长度
    scanf("%d%d", &n, &m); // 输入两个字符串的长度
    
    cin >> a + 1 >> b + 1; // 输入两个字符串
    
    // 动态规划求解最长公共子序列
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= m; ++j){
            f[i][j] = max(f[i - 1][j], f[i][j - 1]); // 更新f[i][j]的值
            // 如果a[i]等于b[j],则更新f[i][j]的值
            if(a[i] == b[j]) f[i][j] = f[i - 1][j - 1] + 1; 
        }
        
    cout << f[n][m] << endl; // 输出最长公共子序列的长度
}


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

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

相关文章

Gurobi输出日志文件的解读【Gurobi】

本章来解读一下Gurobi的刷屏式输出&#xff0c;根本不需要cout&#xff0c;直接通过model.optimize();进行输出。 例如&#xff1a; 现在我们来逐行解读一下&#xff1a; 第一部分&#xff1a;版本型号 可以直接跳过 CPU model: 12th Gen Intel(R) Core(TM) i5-12500H, instr…

【EI会议征稿通知】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议&#xff08;CIBDA 2024&#xff09; 2024 5th International Conference on Computer Information and Big Data Applications 第五届计算机信息和大数据应用国际学术会议&#xff08;CIBDA 2024&#xff09;将于2024年3月22-24日在…

Google Chrome 中出现 ERR_SSL_KEY_USAGE_INCOMPATIBLE 错误

证书的方式发生了变化&#xff0c;出现了这个新错误&#xff0c;导致我无法浏览该网站。 可以右键属性获取位置 关闭导航器chrome并转到文件夹&#xff0c;找到Local State文件并删除 执行指令结束进程&#xff0c;重新打开浏览器即可 taskkill /im "chrome.exe"…

基于C#制作一个俄罗斯方块小游戏

目录 引言游戏背景介绍游戏规则游戏设计与实现开发环境与工具游戏界面设计游戏逻辑实现游戏优化和测试性能优化测试工具和流程说明引言 俄罗斯方块是一款经典的益智游戏,深受玩家喜爱。本文将介绍如何使用C#编程语言制作一个简单的俄罗斯方块小游戏,并探讨其设计与实现过程。…

TOFU: A Two-Step Floorplan Refinement Framework for Whitespace Reduction

TOFU: A Two-Step Floorplan Refinement Framework for Whitespace Reduction 目录 摘要一、简介二、准备工作2.1 布局规划2.2 基于约束图的合法化 3 提出的算法A 概况B 平面图合法化1&#xff09;约束图构造&#xff1a; C 两步空白删除框架1.基于位置的模块2. 基于区域重新分…

利用二分法及不动点迭代求解非线性方程(MatLab)

一、问题描述 利用二分法及不动点迭代求解非线性方程。 二、实验目的 掌握二分法及不动点迭代的算法原理&#xff1b;能分析两种方法的收敛性&#xff1b;能熟练编写代码实现利用二分法及不动点迭代来求解非线性方程。 三、实验内容及要求 二分法 (1) 编写代码计算下列数字…

华为配置小型网络WLAN 的基本业务示例

配置小型网络WLAN基本业务示例 组网图形 图1 配置小型网络WLAN基本业务组网图 小型WLAN网络简介配置注意事项组网需求数据规划配置思路操作步骤配置文件 小型WLAN网络简介 本文介绍的WLAN网络是指利用频率为2.4GHz或5GHz的射频信号作为传输介质的无线局域网&#xff0c;相对于有…

Vue-43、Vue中组件自定义事件

1、给学生绑定atguigu事件 2、在组件内触发事件 第二种写法 传多个参数。 解绑 解绑一个事件 解绑多个自定义事件 this.$off([xxx1,xxx2]);解绑所有事件 this.$off();总结

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具&#xff0c;在数据获取方面也是十分好用&#xff0c;能够十分快速的见到效果&#xff0c;这都取决于selenium框架的足够的灵活性&#xff0c;甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

【活动回顾】CMeet 成都:转鸿蒙 对应用开发来说是否是职业发展新机会 - 圆满结束!

文章目录 前言一、活动介绍二、精彩分享内容及活动议程2.1、《COC 成都社区情况和活动介绍》2.2、“匿”问我答&#xff0c;现场互动2.3、《话题一&#xff1a;升职加薪》2.4、《话题二&#xff1a;说说鸿蒙》2.5、2023 CSDN 1024 程序员节成都站贡献人物表彰2.6、《话题三&…

谁说后端不能画出美丽的动图?让我来给大家拜个年!

今天我们要介绍的是Python的内置库——小海龟&#xff08;turtle&#xff09;&#xff0c;它是一个非常实用的绘画工具&#xff0c;不仅可以帮助我们绘制图形&#xff0c;还能让我们查看整个绘画过程。即使对绘画一窍不通的人也能够使用它来创作出生动、形象的gif动图。现在正是…

AIGC项目——Meta:根据对话音频生成带动作和手势的3d逼真数字人

From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations From Audio to Photoreal Embodiment:Synthesizing Humans in Conversations 从二元对话的音频中&#xff0c;我们生成相应的逼真的面部、身体和手势。 概括性:角色是由作者的声音驱动的(而不是模…

【获奖必看2.0】美赛小技巧之一秒输入一个公式

大家好呀&#xff0c;美赛开赛还有四天的时间&#xff0c;今天给大家带来的是美赛论文写作时非常实用的一个小技巧——快速输入任何复杂公式。 相信很多小伙伴在论文写作的时候都有一个小烦恼&#xff0c;那就是在面对比较复杂的公式的时候&#xff0c;应该怎么进行快速输入呢…

12.2 关键点提取——SIFT

一、理论 文章看了以下博文&#xff1a;Sift中尺度空间、高斯金字塔、差分金字塔&#xff08;DOG金字塔&#xff09;、图像金字塔-CSDN博客 该文章对SIFT写的很详细&#xff0c;所以在这里我直接抄过来作为笔记。如果以后作者变为付费文章可以提醒我删除。 1.图像金字塔 图像…

酒店|酒店管理小程序|基于微信小程序的酒店管理系统设计与实现(源码+数据库+文档)

酒店管理小程序目录 目录 基于微信小程序的酒店管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员模块的实现 (1) 用户信息管理 (2) 酒店管理员管理 (3) 房间信息管理 2、小程序序会员模块的实现 &#xff08;1&#xff09;系统首页 &#xff0…

Spring Boot + security + jwt 测试安全策略

一、测试概述 主要目的是测试security的用法。因测试搭建mysql和redis比较麻烦&#xff0c;所以我这里将自定义的jwt和用户信息缓存到程序的内存中。 本人测试的项目比较混乱&#xff0c;Spring Boot父类只标出有用的依赖。其子类用的版本为jdk11。后续会继续深入oauth2&#x…

微服务-微服务Alibaba-Nacos注册中心实现

1. 系统架构的演变 俗话说&#xff0c; 没有最好的架构&#xff0c;只有最合适的架构。 微服务架构也是随着信息产业的发展而出现的最有普 遍适用性的一套架构模式。通常来说&#xff0c;我们认为架构发展历史经历了这样一个过程&#xff1a;单体架构——> 垂直架构 ——&g…

Java后端须知的前端知识

Java后端须知的前端知识 HTML &#xff08;超文本标记语言&#xff09; W3C标准 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript 快速入门 <html><head><title></title></head><body><font color"red&q…

【linux】复制cp和硬连接、软连接的区别? innode 关系?

1.命令&#xff1a; cp -r [源文件或目录] [目的目录] #复制 ln -s [被链接的文件] [链接的目录/名称] #软连接 ln [被链接的文件] [链接的目录/名称] #硬连接 注&#xff1a;cp -r 会把所有source当作普通文件&#xff08;regular文件&#xff09;&#x…

vue3.0 + 动态加载组件 + 全局注册组件

首先 vue 动态加载组件使用的是 component 标签&#xff0c;并通过设置组件的is 属性来指定要渲染的组件。例如&#xff1a; <component :is"currentComponent"></component>其中&#xff0c;currentComponent 是一个变量&#xff0c;它的值可以是以下几…