简单DP算法(动态规划)

简单DP算法

  • 算法思想
  • 例题
    • 1、01背包问题
      • 题目信息
      • 思路
      • 题解
    • 2、摘花生
      • 题目信息
      • 思路
      • 题解
    • 3、最长上升子序列
      • 题目信息
      • 思路
      • 题解
  • 题目练习
    • 1、地宫取宝
      • 题目信息
      • 思路
      • 题解
    • 2、波动数列
      • 题目信息
      • 思路
      • 题解

算法思想

从集合角度来分析DP问题
例如求最值、求个数
在这里插入图片描述

例题

1、01背包问题

题目信息

在这里插入图片描述

思路

在这里插入图片描述

题解

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define maxsize 1010
using namespace std;int n,m;
int v[maxsize],w[maxsize];
int f[maxsize][maxsize];signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++) cin>>v[i]>>w[i];for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){f[i][j]=f[i-1][j];   //左半边的子集if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);}}cout<<f[n][m]<<endl;return 0;
}

2、摘花生

题目信息

在这里插入图片描述
在这里插入图片描述

思路

在这里插入图片描述

题解

#include <bits/stdc++.h>
#define int long long 
#define endl '\n'
#define maxsize 110
using namespace std;int t;
int w[maxsize][maxsize],f[maxsize][maxsize];signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>t;for(int i=1;i<=t;i++){int a,b;cin>>a>>b;for(int x=1;x<=a;x++){for(int y=1;y<=b;y++){cin>>w[x][y];}}for(int x=1;x<=a;x++){for(int y=1;y<=b;y++){f[x][y]=max(f[x-1][y],f[x][y-1])+w[x][y];}}cout<<f[a][b]<<endl;}return 0;
}

3、最长上升子序列

题目信息

在这里插入图片描述

思路

在这里插入图片描述
博主看到有一篇博客中的思路易于理解,复制如下:

	我们都知道,动态规划的一个特点就是当前解可以由上一个阶段的解推出, 由此,把我们要求的问题简化成一个更小的子问题。子问题具有相同的求解方式,只不过是规模小了而已。最长上升子序列就符合这一特性。我们要求n个数的最长上升子序列,可以求前n-1个数的最长上升子序列,再跟第n个数进行判断。求前n-1个数的最长上升子序列,可以通过求前n-2个数的最长上升子序列……直到求前1个数的最长上升子序列,此时LIS当然为1。让我们举个例子:求 2 7 1 5 6 4 3 8 9 的最长上升子序列。我们定义d(i) (i∈[1,n])来表示前 i 个数以A[ i ]结尾的最长上升子序列长度。前1个数 d(1)=1 子序列为2;前2个数 7前面有2小于7 d(2)=d(1)+1=2 子序列为2 7前3个数 在1前面没有比1更小的,1自身组成长度为1的子序列 d(3)=1 子序列为1前4个数 5前面有2小于5 d(4)=d(1)+1=2 子序列为2 5前5个数 6前面有2 5小于6 d(5)=d(4)+1=3 子序列为2 5 6前6个数 4前面有2小于4 d(6)=d(1)+1=2 子序列为2 4前7个数 3前面有2小于3 d(3)=d(1)+1=2 子序列为2 3前8个数 8前面有2 5 6小于8 d(8)=d(5)+1=4 子序列为2 5 6 8前9个数 9前面有2 5 6 8小于9 d(9)=d(8)+1=5 子序列为2 5 6 8 9d(i)=max{d(1),d(2),……,d(i)} 我们可以看出这9个数的LIS为d(9)=5总结一下,d(i) 就是找以A[ i ]结尾的,在A[ i ]之前的最长上升子序列+1,即前 i 个数的 LIS 长度 + 1。当A[ i ]之前没有比A[ i ]更小的数时,d(i) = 1。所有的d(i)里面最大的那个就是最长上升子序列。其实说的通俗点,就是每次都向前找比它小的数和比它大的数的位置,将第一个比它大的替换掉,这样操作虽然LIS序列的具体数字可能会变,但是很明显LIS长度还是不变的,因为只是把数替换掉了,并没有改变增加或者减少长度。但是我们通过这种方式是无法求出最长上升子序列具体是什么的,这点和最长公共子序列不同。原文链接:https://blog.csdn.net/lxt_Lucia/article/details/81206439

题解

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define maxsize 1010
using namespace std;int n;
int a[maxsize];
int f[maxsize];   //用来存储到f(i)最长子序列的个数signed main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++) cin>>a[i];int res=0;for(int i=1;i<=n;i++){f[i]=1;for(int j=1;j<i;j++){if(a[i]>a[j]){f[i]=max(f[i],f[j]+1);}}res=max(res,f[i]);}cout<<res<<endl;return 0;
}

题目练习

1、地宫取宝

题目信息

在这里插入图片描述

思路

题解

2、波动数列

题目信息

在这里插入图片描述

思路

题解

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android EditText关于imeOptions的设置和响应

日常开发中&#xff0c;最绕不开的一个控件就是EditText&#xff0c;随之避免不了的则是对其软键盘事件的监听&#xff0c;随着需求的不同对用户输入的软键盘要求也不同&#xff0c;有的场景需要用户输入完毕后&#xff0c;有一个确认按钮&#xff0c;有的场景需要的是回车&…

深入解析域名短链接生成原理及其在Python/Flask中的实现策略:一篇全面的指南与代码示例

为了构建一个高效且用户友好的域名短链服务&#xff0c;我们可以将项目精简为以下核心功能板块&#xff1a; 1. 用户管理 注册与登录&#xff1a;允许用户创建账户并登录系统。 这部分内容可以参考另一片文章实现&#xff1a; 快速实现用户认证&#xff1a;使用Python和Flask…

Mysql知识点汇总

Mysql知识点汇总 1. Mysql基本场景的简单语句。2. Mysql的增删改查&#xff0c;统计表中的成绩最好的两个同学的名字&#xff0c;年级等。3&#xff1a;请使用多种方法查询每个学生的每门课分数>80的学生姓名4、order by&#xff0c;group by&#xff0c;子查询4.1、having和…

基于PPNSA+扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于PPNSA扰动算子的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图和优化收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行…

[嵌入式系统-27]:RT-Thread -14- 操作系统配置:rtconfig.h文件与menuconfig命令

目录 一、rtconfig.h 1.1 概述 1.2 软硬件资源配置 1.3 功能模块选择 1.4 内核配置详解 1.5 调度器配置 1.6 硬件设备驱动配置 1.7 网络配置 1.8 调试配置 二、menuconfig 2.1 概述 2.2 主要功能 三、RT Thread配置 VS Linux配置 一、rtconfig.h 1.1 概述 rtco…

【NI-DAQmx入门】数据采集中的降噪技术

1.什么是噪声&#xff1f; 噪声是电路中存在的与期望信号不同的任何电信号 噪声可以降低&#xff0c;但不能消除 噪声可以在源头处被抑制 通过耦合可以降低数据传输通道的噪声 2.噪声耦合方法 导电性 电容性 感应性 其他 3.传导耦合噪声 来自不同电路的电流在一个公共阻抗中共…

DDD爱好者通病-《软件方法》自测题解析37

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《软件方法》第5章自测题2 5 [ 单选题 ] 我们经常会听到有人说“系统分为几个功能模块”。针对“功能模块”&#xff0c;以下说法正确的是&#xff1a;  A) 它把外部和内部混在一…

前端小案例——购买电影票(HTML+CSS+JS, 附源码)

一、前言 实现功能&#xff1a; 这段代码实现了一个简单的电影票选座购买的功能界面。 在页面上展示了一个电影院的座位布局&#xff0c;以及右侧显示了电影信息、选座情况、票价、总计等内容。 用户可以通过点击座位来选择购买电影票&#xff0c;每个座位的状态会在点击时改…

详解自定义类型:枚举与联合体!

目录 ​编辑 一、枚举类型 1.枚举类型的声明 2.枚举类型的优点 3.枚举类型的使用 二、联合体类型(共用体&#xff09; 1.联合体类型的声明 2.联合体的特点 3.相同成员的结构体和联合体的对比 4.联合体大小的计算 5.用联合体判断大小端 三.完结散花 悟已往之不谏&…

5年前端老司机:浅谈web前端开发技术点

有部分同学和朋友问到过我相关问题。利用周末我就浅浅地谈谈我对web前端开发的理解和体会&#xff0c;仅仅能浅浅谈谈&#xff0c;高手请自己主动跳过本篇文章。 毕竟我如今经验并非非常足&#xff0c;连project师都算不上&#xff0c;更不用说大牛了。今天也不谈技术。技术非…

给定n个结点m条边的简单无向图,判断该图是否存在鱼形状的子图:有一个环,其中有一个结点有另外两条边,连向不在环内的两个结点。若有,输出子图的连边

题目 思路: #include <bits/stdc++.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn = 1e6 + 5, inf = 1e18 * 3, maxm = 4e4 + 5,…

OpenAI Sora技术报告[中文版] - 视频生成模型:构建虚拟世界的模拟器

OpenAI近日发布了震撼视频生成产品Sora&#xff0c;生成效果非常炸裂。 以下是提示词的生成&#xff1a; 在一个装饰华丽的历史大厅里&#xff0c;一道巨大的海浪正准备冲击而来。两位冲浪者抓住机会&#xff0c;巧妙地驾驭着海浪。 OpenAI使用了视觉数据的补片技术转化&#…