【算法每日一练]-动态规划 (保姆级教程 篇16) #纸带 #围栏木桩 #四柱河内塔

目录

今日知识点:

计算最长子序列的方案个数,类似最短路径个数问题

四柱河内塔问题:dp[i]=min{ (p[i-k]+f[k])+dp[i-k] } 

纸带

围栏木桩

 四柱河内塔


        

        
纸带

思路:

我们先设置dp[i]表示从i到n的方案数。

那么减法操作中:i可以移动到[1,i-1]中的任意一个格子。反过来可以认为:i可以从i+1到n转移过来。所以得出dp[i]=dp[i+1]+…dp[n];(使用后缀和即可)

然后除法操作中:i可以移动到[1,i/2]中的任意一个格子。反过来可以认为:i可以从x/2==i的任意x移动过来。所以得出dp[i]+=sum[i*j]-sum[i*j+j](i*j<=n)

#include <bits/stdc++.h>
using namespace std;
const int N=4e6+5;
int n,mod,dp[N],sum[N];

int main(){
	cin>>n>>mod;
	dp[n]=sum[n]=1;
	for(int i=n-1;i>=1;i--){
		dp[i]=sum[i+1];//减法
		for(int j=2;j*i<=n;j++){//除法
			int r=min(n,i*j+j-1);
			dp[i]=(dp[i]+sum[i*j]-sum[r+1])%mod;
		}
		sum[i]=(sum[i+1]+dp[i])%mod;
	}	
	cout<<dp[1];
}

        

         

围栏木桩

 输入:
3
9 10 1 9 8 7 6 3 4 6
3 100 70 102
6 40 37 23 89 91 12

思路:

其实就是先找最长上升子序列,然后再求有多少个最长的上升子序列。

首先设置dp[i]表示以i结尾的最长上升子序列。

转移:(i能拼在j后面的话)dp[i]=max(dp[j])+1;

那么要求有多少个最长上升子序列的话就要进行修改,

把dp[i]=max(dp[j])+1改成 if(dp[j]+1>dp[i]) dp[i]=dp[j]+1;

这样的话就能知道什么时候修改了dp[i],当修改dp[i]的时候自然是因为i可以拼在j之后且拼完后dp[i]会变大。

故:f[i]=f[j]

当dp[j]+1=dp[i]时候,说明i即便拼在j后面dp也不会变化,那就说明拼在这个j后面也是最优解。

故:f[i]+=f[j]

类似最短路径个数问题嘛!

#include <bits/stdc++.h>
using namespace std;
const int N=27;
int n,m,h[N],dp[N],f[N],ans1,ans2;

int main(){
	cin>>m;
	while(m--){
		cin>>n;
		ans1=0;ans2=0;
		for(int i=1;i<=n;i++){
			cin>>h[i];
			dp[i]=f[i]=1;
		}
		for(int i=2;i<=n;i++)
			for(int j=i-1;j;j--){
				if(h[j]<=h[i]){
					if(dp[j]+1>dp[i]){//更新最优解就继承
						dp[i]=dp[j]+1;
						f[i]=f[j];
					}
					else if(dp[j]+1==dp[i])//当前的j也是可以使变成最优解的j
						f[i]+=f[j];
				}
			}
		for(int i=1;i<=n;i++)
			ans1=max(ans1,dp[i]);
		for(int i=1;i<=n;i++)
			if(dp[i]==ans1)
			ans2+=f[i];
		cout<<ans1<<" "<<ans2<<'\n';
	}	
}

        

         

 四柱河内塔

思路:

这道题听过的很简单,没见过的确实很难做了。

首先我们从最简单的3柱开始:就如下图,对于n柱的河内塔把第一柱上面n-1个放到中间的柱子上,然后剩下的一个放到最右边,然后就转化成了把n-1个盘子的三柱河内塔问题。

设置dp[i]表示i个盘子的三柱河内塔问题。

那么对应转移方程:dp[i]=(dp[i-1]+1)+dp[i-1]=2*dp[i-1]+1

那么现在来考虑四柱河内塔情况:

对于n个盘子的四柱河内塔,我们先将上面的n-k个放到任意一柱上,然后剩余的k个放到最右边柱子。最后也转化成了n-k个盘子的四柱河内塔问题。

要注意的一点是:在转移k个盘子的情况属于3柱的河内塔问题,因为有一柱是不能使用的。

转移方程:dp[i]=(p[i-k]+f[k])+dp[i-k]  其中f[k]是三柱k个盘子的河内塔问题。dp[i-k]是四柱n-k个盘子的河内塔问题。但是我们并不确定到底是让k取多少,但是我们确定的是k的选值必须使得dp[i]最小。那么就有dp[i]=min{ (p[i-k]+f[k])+dp[i-k] } 

         

下面是代码部分 

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int f,dp[55];
int main(){
	cin>>f;
	memset(dp,INF,sizeof(dp));
	dp[0]=0;dp[1]=1;dp[2]=3;//初始化
	cout<<1<<'\n'<<3<<'\n';
	for(int i=3;i<=f;i++){
		for(int j=1;j<i;j++){
			if(dp[i]>2*dp[i-j]+pow(2,j)-1)//pow(2,j)-1就是f[j]的值
			dp[i]=2*dp[i-j]+pow(2,j)-1;
		}
		cout<<dp[i]<<'\n';
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka消息存储

一、层次结构 具体到某个broker上则是, 数据目录/分区名/日志相关文件集合。其中日志文件集合内包括.log文件, index索引文件和.timeindex时间戳索引文件。 二、.log 结构 .log中记录具体的消息。一般消息由header和body组成, 这点儿在Kafka消息中也同样适用。 message MES…

视角与焦距

视角与焦距关系 视角与焦距之间存在密切的关系。在摄影和摄像领域,这两个概念都非常重要。 视角是指相机镜头所能覆盖的视野范围,通常以度数来表示。焦距则是从镜头到成像平面的距离,决定了拍摄的物体在成像平面上的大小。 焦距越短,视角就越大,拍到的画面就越宽广;焦距…

雪王IP +出海,是蜜雪冰城登陆港交所想讲的“新故事”?

霸屏互联网的“雪王”&#xff0c;如今身影出现在港交所。这一次&#xff0c;“雪王”除了出街的气派&#xff0c;也给市场打开了更多的想象空间。 据招股书数据&#xff0c;2023年前三个季度&#xff0c;蜜雪冰城营收同比增加近50%。如今看来&#xff0c;无论是品牌影响力&am…

【数据库学习】ClickHouse(ck)

1&#xff0c;ClickHouse&#xff08;CK&#xff09; 是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 1&#xff09;特性 按列存储&#xff0c;列越多速度越慢&#xff1b; 按列存储&#xff0c;数据更容易压缩&#xff08;类型相同、区分度&#xff09;&#xff1b…

Flink/Doris生产环境方案选型的一些思考

各位总监&#xff0c;技术负责人&#xff0c;架构师们大家好。今天的文章有点短&#xff0c;是一些个人思考&#xff0c;仅做记录。 以Flink为主的计算组件和以Doris为代表的存储计算一体的方案选择问题是我们在技术选型过程中最常见的问题之一。也是很多公司和业务支持过程中会…

locust 快速入门--一次接口压测

背景&#xff1a; 使用locust&#xff0c;借助webUI&#xff0c;完成一次接口压测 实现步骤&#xff1a; 完成locust环境配置 准备一个locustfile&#xff08;current_limiting_test.py&#xff09; from locust import HttpUser, task, events from locust.env import Envi…

海外市场调研为什么要用独享静态代理IP?

独享静态IP在海外市场调研中扮演着至关重要的角色&#xff0c;提供了一系列无可比拟的优势。独享静态代理IP的稳定性和可靠性对于长期的市场调研至关重要&#xff0c;它保证了连接的持续性和数据的准确性。通过这些方面的综合优势&#xff0c;独享静态代理IP成为海外市场调研中…

Kali安装Xrdp结合内网穿透实现无公网ip远程访问系统桌面

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于&#xff0c;它允许用户从远程位置访问Kali系统&#xff0c;而无需直接物理访…

数字化校园实验室综合管理平台|推动实验室创新发展新引擎

一、数字化建设目标 实验室数字化指的是运用新一代的人工智能、大数据、互联网技术、物联网技术、云计算技术、人体感应技术、语音技术、生物识别技术、手机APP等技术&#xff0c;实现各个业务间数据流和任务流的互通互联&#xff0c;将实验室管理过程中涉及的对象&#xff0c…

C语言——结构体类型(二)【结构体内存对齐,结构体数组】

&#x1f4dd;前言&#xff1a; 上一讲结构体类型&#xff08;一&#xff09;中&#xff0c;我们讲述了有关结构体定义&#xff0c;创建&#xff0c;初始化和引用的内容&#xff0c;这一讲&#xff0c;我们进一步学习结构体的相关知识&#xff1a; 1&#xff0c;结构体内存对齐…

如何搭建开源知识库软件AFFiNE并实现公网环境远程协作【内网穿透】

目录 前言 1. 使用Docker安装AFFINE 2. 安装cpolar内网穿透工具 3. 配置AFFINE公网访问地址 4. 实现公网远程访问AFFINE 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何搭建开源知识库软件AFFiNE并实现公网环境远程协作【内网穿…

Python 代码轻松实现 HTML 文件及HTML字符串到 PDF 文档的转换

从网页生成文档已经是一种常见需求。无论是为了存档网页内容、离线共享网页或创建可打印的报告&#xff0c;经常会需要一种可靠的方法将HTML文件转换为稳定且普遍可访问的PDF格式。通过利用强大的Python语言&#xff0c;我们可以轻松地使用Python程序将HTML转换为PDF&#xff0…

2024在视频号开店怎么样?平台现状如下,有电商经验者优先!

我是王路飞。 现在开网店、做电商的平台有很多&#xff0c;但是有着绝对流量优势的&#xff0c;除了抖音之外就是视频号了。 但是抖音跟视频号相比&#xff0c;已经属于一个很成熟的平台了&#xff0c;商家们也开始进入到内卷阶段了。 所以&#xff0c;如果你们2024年想做电…

100个GEO基因表达芯片或转录组数据处理之GSE126848(003)

写在前边 虽然现在是高通量测序的时代&#xff0c;但是GEO、ArrayExpress等数据库储存并公开大量的基因表达芯片数据&#xff0c;还是会有大量的需求去处理芯片数据&#xff0c;并且建模或验证自己所研究基因的表达情况&#xff0c;芯片数据的处理也可能是大部分刚学生信的道友…

如何在OpenWRT部署uhttpd搭建服务器实现远程访问本地web站点

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

Python--函数

函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。 函数能提高应用的模块性&#xff0c;和代码的重复利用率。你已经知道Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被叫做用户…

VLAN 详解二(VLAN 基础配置)

VLAN 详解二&#xff08;VLAN 基础配置&#xff09; VLAN 配置其实是非常简单的&#xff0c;但是想要学得比较精还是需要花费一些功夫的&#xff0c;根据不同的 VLAN 划分方式用不同的配置方法&#xff0c;但其实配置方法基本上都大同小异。 下面就以在实际网络中最常用的基于…

[Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用

前面讲解了使用Helm部署mysql集群,这里来看看使用Ingress搭建负载均衡功能 1.介绍 功能类似 Nginx ,可以根据域名、路径把请求转发到不同的 Service , Ingress 为外部访问集群提供了一个 统一 入口, 避免 了 对外暴露集群端口 ,可以配置 https,http访问集群应用,接下来看看如…

用java实现Client和Server之间的互相通信

概要&#xff1a;看过我之前文章的人都知道&#xff0c;client和server之间的通信必不可少的就是socket。而java已经帮我们做了很多事情。 创建Server端 第一步&#xff0c;创建ServerSocket 这个从名字上就可以看出来&#xff0c;服务器上的socket 0.0 ServerSocket ser…

k8s-调度 13

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面的一部分。 如果你真的希望或者有…