简单DP算法(动态规划)

news/2024/11/29 1:37:36/

简单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.ppmy.cn/news/1353652.html

相关文章

定时器外部时钟

一、相较于内部时钟中断改动&#xff1a; 1.Timer.c RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin GPIO_Pin_…

【前端工程化面试题】使用 webpack 来优化前端性能/ webpack的功能

这个题目实际上就是来回答 webpack 是干啥的&#xff0c;你对webpack的理解&#xff0c;都是一个问题。 &#xff08;1&#xff09;对 webpack 的理解 webpack 为啥提出 webpack 是啥 webpack 的主要功能 前端开发通常是基于模块化的&#xff0c;为了提高开发效率&#xff0…

K8S部署Java项目(Gitlab-->Harbor-->K8S)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Resolving Low-Level Graphics Issues

Resolving Low-Level Graphics Issues 在远程操作其他工作站上的matlab的时候&#xff0c;无法显示仿真结果&#xff0c;但是在真实的工作站上操作的话又可以看到simulation的结果&#xff0c;并且远程的时候进行仿真&#xff0c;就会显示以下的错误提示&#xff1a; >>…

【前端工程化面试题目】webpack 的热更新原理

可以在顺便学习一下 vite 的热更新原理&#xff0c;请参考这篇文章。 首先有几个知识点需要明确 热更新是针对开发过程中的开发服务器的&#xff0c;也就是 webpack-dev-serverwebpack 的热更新不需要额外的插件&#xff0c;但是需要在配置文件中 devServer属性中配置&#x…

PMP考试之20240217

1、在过去的几年里&#xff0c;一个组织通过接管同一领域的多家公司&#xff0c;发展成为一个企业集团。这显著增加了其项目、计划和投资组合的数量。一个组织应该同时管理多少活跃的投资组合&#xff1f; A. 一次只管理一个组合 B.基于分配给组合管理的人力资源的规模 C.每…

紫微斗数全书卷一斗数太微赋

文章目录 前言太微赋形性赋星垣论斗数准绳斗数发微论重补斗数彀率增补太微赋总结 前言 紫微斗数全书卷一 太微赋 斗数至玄至微&#xff0c;理旨难明&#xff0c;虽设问于各篇之中&#xff0c;犹有言而未尽&#xff0c;至如星之分野&#xff0c;各有所属&#xff0c;寿夭贤愚&…

Python第十七章(继承)

继承&#xff1a;子类继承父类的所有方法和属性 一。单继承&#xff1a;一个子类继承一个父类 注释&#xff1a;B是子类&#xff0c;继承了A的函数方法&#xff0c;当调用B时候&#xff0c;会同时使用A中的全部方法&#xff0c;object类是顶级类或者基类&#xff0c;其他子类叫…