蓝桥杯每日一题(背包dp,线性dp)

//3382 整数拆分

将 1,2,4,8看成一个一个的物品,以完全背包的形式放入。

一维形式:f]0]=1;

#include<bits/stdc++.h>
using namespace std;
//3382整数拆分
const int N=1e6+10, M=5e5+10;
int mod=1e9;
int f[N],n;
int main()
{cin>>n;//转化为完全背包问题,//状态是找前i个二进制数,组成j的数量f[0]=1;for(int i=1;i<=n;i*=2)////和完全背包一样遍历所有物品(以前i件物品){for(int j=i;j<=n;j++){f[j]=(f[j]+f[j-i])%mod;}}cout<<f[n]<<endl;
}

由于二维形式会爆。下面给出写法

需要注意的一点是:由于每次只用到前一层循环的数据,当前层j放不下i的位置,也就是j<i的位置,也要更新,因为下一层可能用到这个数据,不更新的话,就都是0了。

#include<bits/stdc++.h>
using namespace std;const int N=1e3+10, M=5e2+10;
int mod=1e9;
int f[N][N], n;int main()
{cin >> n;for(int i=0; i<=n; i++){f[i][0] = 1;}int t;for(int i=1; i<=n; i*=2){t=i;for(int j=1; j<=n; j++){f[i][j] = f[i/2][j];if(j >= i){f[i][j] = (f[i][j] + f[i][j-i]) % mod;}}}cout << f[t][n] << endl;
}

  2 01 背包问题

注意存w和v的的值是从1开始。因为还要考虑状态i-1 

#include<bits/stdc++.h>
using namespace std;
// 2 01 背包问题
const int N=1010;
int w[N],v[N];
int f[N][N];//前N件物品,背包容量
int main()
{int n,V;cin>>n>>V;for(int i=1;i<=n;i++){cin>>v[i]>>w[i];}//for(int i=0;i<=V;i++)f[0][i]=0;for(int i=1;i<=n;i++){for(int j=0;j<=V;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][V]<<endl;}

8完全背包问题

#include<bits/stdc++.h>
using namespace std;
// 8 完全背包问题
const int N=1010;
int f[N][N];
int n,m;
int w[N],v[N];
int main()
{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][j-v[i]]+w[i]);}}cout<<f[n][m]<<endl;
}

9分组背包问题

完全背包问题是k的个数作为循环。分组背包是组内的所有物品作为循环;

#include<bits/stdc++.h>
using namespace std;
//9 分组背包问题
const int N=110;
int f[N][N];
int n,m;
int w[N][N],v[N][N],s[N];
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){int t;cin>>t;s[i]=t;for(int j=1;j<=t;j++){cin>>v[i][j]>>w[i][j];}}for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){f[i][j]=f[i-1][j];for(int k=1;k<=s[i];k++){if(v[i][k]<=j){f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);}}}}cout<<f[n][m]<<endl;
}

//6 多重背包问题III

多重背包比完全背包多了个数的限制条件

没有用优化:SF错误


#include<bits/stdc++.h>
using namespace std;
//6 多重背包问题 III
const int N=3010;
int f[N];
int n,m;
int w[N],v[N],s[N];
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){cin>>v[i]>>w[i]>>s[i];}for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){for(int k=0;k <= s[i] && k*v[i] <= j;k++){f[j]=max(f[j],f[j-v[i]*k]+w[i]*k);}}}cout<<f[m]<<endl;
}

//1051最大的和

f数组保存从1到i,连续的子串的最大值。

rf数组保存从i到n的~

在计算f的时候,要时刻记住求的是前i个数中连续的一个最大的子串

然后用df思想思考,要么选a[i]要么不选,选ai的时候要保证前面是连续的。

因而用s这个临时变量,保存必选ai的时候的最大值。‘


#include<bits/stdc++.h>
using namespace std;
//1051最大的和
const int N=50010;
int f[N],rf[N],a[N];
int main()
{int t,n;cin>>t;while(t--){cin>>n;for(int i=1; i<=n; i++)cin>>a[i];//避免出现全都是负数,但是结果为全0memset(f,-0x3f,sizeof f);memset(rf,-0x3f,sizeof rf);
//找从1到n 以i结尾的连续串的最大的和是多少int s=0;//截止到i这个位置,而且必须加上a[i]的最大值for(int i=1; i<=n; i++){//用闫氏dp的思考方式思考//i这个点的f值,要么加上a[i],要么不加。//s就保存了加上ai的结果,s永远保存在运行到i的时候的位置的最大值(包含a[i])s=max(s,0)+a[i];//要保证是一个和a[i]连续的数f[i]=max(s,f[i-1]);}s=0;for(int i=n; i>=1; i--){s=max(0,s)+a[i];rf[i]=max(s,rf[i+1]);}int res=-0x3f3f3f3f;for(int i=1;i<=n;i++){res=max(res,rf[i+1]+f[i]);}cout<<res<<endl;}}

898、数字三角形

第一个自己做出来的线性dp,注意为了防止出现全零的情况,一定要初始化为-0x3f3f3f3f

在找上一个状态的时候,注意下标不要错。

#include<bits/stdc++.h>
using namespace std;
//898 数字三角形
const int N=510;
int f[N][N];
int a[N][N];
int main()
{int n;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>a[i][j];}}for(int i=0;i<=n;i++){for(int j=0;j<=i;j++){f[i][j]=-0x3f3f3f3f;}}f[1][1]=a[1][1];for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){if(j==1){f[i][j]=f[i-1][1]+a[i][j];}else if(j==i){f[i][j]=f[i-1][i-1]+a[i][j];}else{f[i][j]=max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);}}}int res=-0x3f3f3f3f;for(int i=1;i<=n;i++){res=max(res,f[n][i]);}cout<<res<<endl;
}

//895、最长上升子序列

没有严格按照岩石地皮分析法思考导致没想出来。

数组表示某个点之前的点,构成的子序列的最长长度。

状态的计算:循环之前的所有以小于i的点为结尾的子序列的长度,然后根据大小是否加一,是否更新。

#include<bits/stdc++.h>
using namespace std;
//895 最长上升子序列
const int N=1010;
int n;
int f[N],a[N];
int main()
{cin >> n;for(int i=1;i<=n;i++)cin>>a[i];memset(f,0x3f,sizeof f);//memset(a,0x3f,sizeof a);f[1]=1;for(int i=2;i<=n;i++){f[i]=1;for(int j=1;j<=i;j++){if(a[i]>a[j]){if(f[j]+1>f[i]){f[i]=f[j]+1;}}}}cout<<f[n]<<endl;}

897 最长公共子序列

状态计算看的题解,如果相等就是f[i-1][j-1]+1

如果不等,其中至少有一个不再公共子序列里面。

max(f[i-1][j],f[i][j-1],f[i-1][j-1]) 根据常识知道f[i-1][j-1]<=(f[i-1][j],f[i][j-1]的任意一个)

#include<bits/stdc++.h>
using namespace std;
//897 最长公共子序列
const int N=1010;
int n,m;
int f[N][N];
char a[N],b[N];
int main()
{cin >> n>>m;scanf("%s",a+1);scanf("%s",b+1);for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){if(a[i]==b[j]){f[i][j]=f[i-1][j-1]+1;}else{f[i][j]=max(f[i-1][j],f[i][j-1]);}}}cout<<f[n][m]<<endl;
}

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

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

相关文章

linux 迁移home目录以及修改conda中pip的目录,修改pip安装路径

1&#xff09;sudo rsync -av /home/lrf /data/home/lrf 将/home目录下的文件进行复制&#xff08;假设机械硬盘挂载在/data目录下&#xff09;** 2&#xff09;usermod -d /data/home/lrf -m lrf 修改用户$HOME变量** 3&#xff09;vi /etc/passwd 查看对应用户的$HOME变量是…

网络安全加密算法---对称加密

三位同学一组完成数据的对称加密传输。 三位同学分别扮演图中 A、B 和 KDC 三个角色&#xff0c;说明 KA、KB&#xff0c;KAB 和发送的数据Data 的内容。 给出图中 2 和 3 中的数据&#xff0c;以及 Data 加密后的密文。可以完成多轮角色互换的通信 过程。其中一轮过程要求 K…

洗地机如何选?入手这四款优质好有,幸福感爆棚!

家庭清洁作为每天都必干的一件事&#xff0c;房屋的整洁是让人保持心情愉悦的一种方式。不过每次拿着清洁工具一顿劳作后总是会腰酸背痛&#xff0c;但是洗地机的出现为我们解放了双手。相对于传统的清洁工具&#xff0c;洗地机功能更多样更高效。那么市面上洗地机哪个牌子好&a…

LeetCode31. 下一个排列(Java)

题目&#xff1a; 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如&#xff0c;arr [1,2,3] &#xff0c;以下这些都可以视作 arr 的排列&#xff1a;[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列…

PyQt PySide6零基础入门与项目实战视频教程

目录 课程亮点课程大纲第一章&#xff1a;基础篇 PySide6开发环境安装第二章 控件与布局篇 PySide6常用控件与界面布局使用介绍第三章 信号槽与事件机制第四章 QMainWindow应用篇第五章 样式表qss与自定义控件第六章 图表与曲线第七章 数据库编程第八章 项目实战&#xff1a;高…

Java—抽象方法与接口

声明&#xff1a;以下内容是根据B站黑马程序员的Java课程&#xff0b;博主自己的理解整理而成&#xff0c;课程很好&#xff0c;适合初学者学习。 关于此类题目&#xff0c;重要的是识别出用什么来实现&#xff0c;到底是接口还是抽象方法&#xff0c;还是共有的属性等等&…

QT:事件机制

作业&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTime> #include<QPushButton> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

Vue3---基础1(认识,创建)

变化 相对于Vue2&#xff0c;Vue3的变化&#xff1a; 性能的提升 打包大小减少 41% 初次渲染快 55%&#xff0c;更新渲染快133% 内存减少54% 源码的升级 使用 proxy 代替 defineProperty 实现响应式 重写虚拟 DOM 的实现和 Tree-shaking TypeScript Vue3就可以更好的支持TypeSc…

Redis中的集群(四)

集群 槽指派 CLUSTER ADDSLOTS命令的实现 CLUSTER ADDSLOTS命令接受一个或多个槽作为参数&#xff0c;并将所有输入的槽指派给接收该命令的节点负责: CLUSTER ADDSLOTS <slot> [slot ...]CLUSTER ADDSLOTS命令的实现可以用以下伪代码来表示: def CLUSTER_ADDSLOTS(*…

JavaScript - 请你为数组自定义一个方法myFind,使其实现find方法的功能

难度级别:中级及以上 提问概率:50% 我们知道数组的find方法是ES6之后出现的,它强调找到第一个符合条件的元素后即跳出循环,不再继续执行,那么如果不用ES6的知识,为数组添加一个自定义方法实现find方法的功能,首先要想到在数组的原型pro…

探索进程控制第一弹(进程终止、进程等待)

文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么&#xff1f;进程终止的情况代码跑完&#xff0c;结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…

基础算法(算法竞赛、蓝桥杯)--堆排序

1、B站视频链接&#xff1a;A15 堆 堆排序_哔哩哔哩_bilibili 题目链接&#xff1a;【模板】堆 - 洛谷 #include <iostream> using namespace std; int a[1000010],cnt; void up(int u){ //上浮if(u/2 && a[u/2]>a[u]) swap(a[u],a[u/2]), up(u/2); } void d…

校招详解(术语、时间、流程)

3400字的详细说明&#xff0c;介绍了程序员类岗位校招的整体时间节点和招聘流程。还对一些常见的问题进行讨论&#xff0c;例如内推、offer和三方、实习等。 第一章介绍基本的术语&#xff0c;第二章介绍整个校招的重要流程及时间点&#xff0c;然后第三章介绍每次招聘要经过的…

[方案实操|数据技术]数据要素十大创新模式(1):基于区块链的多模态数据交易服务平台

“ 区块链以其公开共享、去中心化、不可篡改、可追溯和不可抵赖等优势&#xff0c;吸引了包括金融业、医疗业和政府部门等众多利益相关方的极大兴趣&#xff0c;被认为是解决数据安全交换问题的合适方案。” 武汉东湖大数据科技股份有限公司凭借基于区块链的多模态数据交易服务…

计算机组成结构—外部存储器

目录 一、磁盘存储器 1. 磁表面存储器和磁记录原理 2. 硬磁盘的分类和基本结构 &#xff08;1&#xff09;硬磁盘存储器的分类 &#xff08;2&#xff09;硬磁盘存储器的组成 3. 磁盘的工作原理 &#xff08;1&#xff09;磁盘存储区域 &#xff08;2&#xff09;磁盘地…

计算机病毒防治

一、计算机病毒概述 计算机病毒是必然产物。 计算机病毒是一种人为制造的&#xff0c;侵入计算机系统、寄生于应用程序或系统可执行部分&#xff0c;并可以自我复制、传播&#xff0c;具有激活型、攻击性的程序代码。 计算机病毒宿主 病毒大多不以文件形式存在&#xff0c;寄生…

Linux--进程间的通信-匿名管道

进程间的通信 进程间通信&#xff08;IPC&#xff0c;Interprocess Communication&#xff09;是指在不同进程之间传输数据和交换信息的一种机制。它允许多个进程在同一操作系统中同时运行&#xff0c;并实现彼此之间的协作。 进程间通信方式&#xff1a; 管道&#xff08;Pi…

静态页面上传服务器无法显示css效果

今天做比赛的项目&#xff0c;把静态页面上传到服务器&#xff0c;发现外联的css文件的效果无法显示&#xff0c;一开始以为是路径问题&#xff0c;后面改了发现没有改变。 然后发现在浏览器上css文件中content-type: text/plain的问题 这才是正确的&#xff1a; 修改办法&…

【QT】pro文件里添加又删除LIBS不影响运行的原因

我发现个问题啊&#xff0c;如果运行项目&#xff0c;发现报错&#xff0c;缺少某dll&#xff0c;接着你在pro文件里加上win32:LIBS -lOpengl32&#xff08;举个例子&#xff09;&#xff0c;接着可以运行了&#xff0c;接着把这行删掉&#xff0c;再运行&#xff0c;仍然可以…

PCB学习记录---原理图

一、注释 NC&#xff1a;no connect,默认不连接 NF: no fix&#xff0c;默认不安装 0R: 0R的电阻&#xff0c;即可以短路 二、看图流程 1、看标题&#xff0c;了解功能 2、浏览有几个模块 3、找芯片对应的数据手册&#xff0c;了解芯片功能和使用 例如CH224&#xff…