动态规划--(递推2(最长上升子序列,格子染色,斐波那切数列,奇数塔问题,最长子段和))

1281:最长上升子序列
【题目描述】
一个数的序列bi
,当b1<b2<…<bS
的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,…,aN)
,我们可以得到一些上升的子序列(ai1,ai2,…,aiK)
,这里1≤i1<i2<…<iK≤N
。比如,对于序列(1,7,3,5,9,4,8),有它的一些上升子序列,如(1,7),(3,4,8)等等。这些子序列中最长的长度是4,比如子序列(1,3,5,8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

【输入】
输入的第一行是序列的长度N(1≤N≤1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

【输出】
最长上升子序列的长度。

【输入样例】
7
1 7 3 5 9 4 8
【输出样例】
4
【分析】最长上升子序列是动规的经典例题,但还是那句话,先确定dp,再确定状态转移方程,随后找最大值,由于这题是包含递推的,所以状态转移方程和递推有关,但是我们仍要先确定dp。那我们是不是可以设dp[i]表示前i个数的最长上升子序列的长度为dp[i],因为是递推所以dp可以设简单点。然后我们假设一个点为i,那么前i个最长上升子序列是不是max(1+dp[k]),其中的k是小于等于i-1大于等于1的,而且a[k]<a[i],所以这个的意思就是,dp[i]是由前i-1个中的一个数的最长上升子序列+1的最大值得来的,其中那个数必须小于a[i]。这样说还是有点抽象,举个例子,比如我要求前i个数的最长上升子序列,那么小于a[i]的数有a[v1],a[v2],a[v3]这三个,而dp[i]就是dp[v1]+1,dp[v2]+1,dp[v3]+1,dp[i](因为前三个的最大值可能小于dp[i],所以也要加上,但是这是不可能的事,不过为了后面的统一还是加上)的最大值,所以状态转移方程是dp[i]=max(dp[i],dp[k]+1)(k为小于i大于0的自然数)。
【代码环节】代码如下

#include <bits/stdc++.h>
using namespace std;
int n;
int a[1050],dp[1050]; 
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) dp[i]=1;
for(int i=1;i<=n;i++){for(int j=1;j<i;j++){if(a[i]>a[j]){dp[i]=max(dp[i],dp[j]+1);}}
}
int mx=0;
for(int i=1;i<=n;i++) mx=max(mx,dp[i]);   //注意最长上升子序列可能不是dp[n],要再枚举一遍
cout<<mx;return 0;
}

斐波那契数
第1个斐波那契数是1
第2个斐波那契数是1
第3个斐波那契数是2
后面每一个斐波那契数都等于前两个斐波那契数相加
f[n]=(1)(n<=2) ---- (f[n-1]+f[n-2])(n>2)
求第n个斐波那契数
输入
输入一个整数
n≤30
输出
输出一个 整数

样例
输入 1
6
输出 1
8

【分析】等等…这题还要分析?直接通通一顿递归

int fun(int n){if(n<=2) return 1;else return fun(n-1)+fun(n-2);
} 

而递归的时间复杂度是O(t(n)=o(f(n)))但是,这样你会发现,当数大时就不行,比如50,这该怎么办呢?或许可以用dp,不过最主要的是题目已经把dp给你设出来了,dp[i]表示第i个斐波那锲数列的值,状态转移方程也给了 f[n]=f[n-1]+f[n-2],所以此题可用dp,那时,时间复杂度将会是O(n)

#include <bits/stdc++.h>
using namespace std;
int f[55];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
cin>>n;
f[1]=1,f[2]=1;
for(int i=3;i<=n;i++){f[i]=f[i-1]+f[i-2];
}
cout<<f[n];return 0;
}

格子染色
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色。
求全部的满足要求的涂法种数。
输入
输入一个整数n(1≤n≤50)。
输出
输出一个整数表示答案。

样例
输入 1
1
输出 1
3
输入 2
2
输出 2
6
【分析】这题其实是一道数学题,不知道大家知不知道传球法不过这里也不细说了,大家可以上网查查。传球法的过程其实就是dp的递推,所以代码如下

#include<bits/stdc++.h>
using namespace std;
long long dp[55][3];
int main()
{
int n;
cin>>n;
if(n==1){cout<<3;return 0;
}
dp[1][0]=0;
dp[1][1]=dp[1][2]=1;
for(int i=2;i<=n;i++)
{dp[i][0]=dp[i-1][1]+dp[i-1][2];//每个球都是起他俩个传来的dp[i][1]=dp[i-1][0]+dp[i-1][2];dp[i][2]=dp[i-1][1]+dp[i-1][0];
}
cout<<dp[n][0]*3;//起点有三种,我们只算了一种,所以乘3return 0;
} 

拓展【公式法】环形染色公式ans=(m-1)^n+ (-1)^n*(m-1) m为种类,n为长度
推导可上网查阅。

#include<bits/stdc++.h>
using namespace std;
long long n;
int main()
{
cin>>n;
if(n==1){  //特判cout<<3;return 0;
}
long long p=pow(2,n)+pow(-1,n)*2;//公式
cout<<p;return 0;
} 

奇数塔问题
之前,我们已经完成了经典的数塔问题,现在我们将其升级成奇数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,最终答案必须在最后一行,且为奇数,问答案最大是多少?

如果没有答案,则输出-1。

数塔

输入
第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,100]内。

输出
对于每个测试实例,输出可能得到的最大和,如果没有答案,则输出-1。每个实例的输出占一行。

样例
输入 1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出 1
27
输入 2
2
3
5 11
输出 2
-1
提示
1 <= N <= 100 1 <= 数塔中的数 <= 100
【分析】其实这题可以分俩种状态,一个是可以达成奇数,另一个是不可以,我们可以标为-1,还有就是奇数+偶数=奇数,另外和数塔问题相差不大,不会数塔问题的可以看
1258:【例9.2】数字金字塔-----动态规划(递推)1
代码如下

#include<bits/stdc++.h>
using namespace std;
int dp[110][110][2];
int a[110][110];
int main()
{
memset(dp,-1,sizeof(dp));
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){scanf("%d",&a[i][j]);}
}
if(a[1][1]%2==1){dp[1][1][1]=a[1][1];
}
else{dp[1][1][0]=a[1][1];
}
for(int i=2;i<=n;i++){for(int j=1;j<=i;j++){if(a[i][j]%2==1){if(dp[i-1][j][0]!=-1||dp[i-1][j-1][0]!=-1)dp[i][j][1]=max(dp[i-1][j][0],dp[i-1][j-1][0])+a[i][j];if(dp[i-1][j][1]!=-1||dp[i-1][j-1][1]!=-1)dp[i][j][0]=max(dp[i-1][j][1],dp[i-1][j-1][1])+a[i][j];}else{if(dp[i-1][j][1]!=-1||dp[i-1][j-1][1]!=-1)dp[i][j][1]=max(dp[i-1][j][1],dp[i-1][j-1][1])+a[i][j];if(dp[i-1][j][0]!=-1||dp[i-1][j-1][0]!=-1)dp[i][j][0]=max(dp[i-1][j][0],dp[i-1][j-1][0])+a[i][j];}}
}
int ret=-1;
for(int i=1;i<=n;i++){if(dp[n][i][1]>ret){ret=dp[n][i][1];}
}
printf("%d",ret);return 0;
} 

最长子段和
给出一个长度为n 的序列 a,选出其中连续且非空的一段使得这段和最大。

如果均为负数,则输出0。

输入
第一行是一个整数n(1≤n≤2⋅10 ^5 )。

第二行有n 个整数,第 i 个整数表示序列的第 i 个数字

(−10 ^4 ≤a i≤10 ^4 )​。
输出
输出一个整数表示答案。
样例
输入 1
7
2 -4 3 -1 2 -4 3
输出 1
4
【分析】这题我们可以假设dp[i]表示前i个数的最大子段和,还是那句话,递推的dp一般不会太复杂。想想我们该怎么得到dp[i]呢?其实有俩种,1:前i-1的最大子段和加上当前的,构成子段和。2:当前的数单独成为字段。最后求他俩最大值。用状态转移方程的话讲:max(a[i]+dp[i-1],a[i])
代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,a,dp[N];
int main()
{
dp[0]=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){scanf("%d",&a);dp[i]=max(a+dp[i-1],a);  //求自身和上一个加自身谁大
}
int mx=0;
for(int i=1;i<=n;i++) mx=max(mx,dp[i]);//找最大值
printf("%d",mx);return 0;
} 

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

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

相关文章

uniapp开发微信小程序设置分包,简单易学

文章目录 前言一、在 manifest.json文件中的源码试图中配置二、配置pages.json 前言 我们使用uniapp开发微信小程序的时候&#xff0c;当我们的包体积过大的时候&#xff0c;无法真机模拟。 因为小程序单个包只支持2MB&#xff08;现已支持预览4MB&#xff09;&#xff0c;所以…

Docker 学习总结(81)—— 冷门而又实用的 Docker 使用技巧总结

1、docker top 这个命令是用来查看一个容器里面的进程信息的,比如你想查看一个 nginx 容器里面有几个 nginx 进程的时候,就可以这么做。 ➜ ~ docker top 3b307a09d20d UID PID PPID C STIME …

JAVA面试大全之开发基础篇

目录 1、常用类库 1.1、平时常用的开发工具库有哪些? 1.2、Java常用的JSON库有哪些?有啥注意点? 1.3、Lombok工具库用来解决什么问题?

AI:155-基于深度学习的股票价格预测模型

本文收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正在不断更新中~ 一.基于深度学习的股票价格预测模型 …

基于k8s的web服务器构建

文章目录 k8s综合项目1、项目规划图2、项目描述3、项目环境4、前期准备4.1、环境准备4.2、ip划分4.3、静态配置ip地址4.4、修改主机名4.5、部署k8s集群4.5.1、关闭防火墙和selinux4.5.2、升级系统4.5.3、每台主机都配置hosts文件&#xff0c;相互之间通过主机名互相访问4.5.4、…

深入解析大数据Scala面试题及参考答案(持续更新)

Scala,作为一种多范式编程语言,因其强大的功能性和与Java的互操作性,在大数据和并发编程领域备受青睐。本文将深入探讨10个常见的Scala面试题,并提供详尽的参考答案,以期帮助读者在面试中展现其Scala编程的深厚功底。 目录 1. Scala的基本特性是什么? 2. 什么是函数式…

总结IP协议各类知识点

前言 本篇博客博主将详解IP协议中的各类知识点&#xff0c;坐好板凳发车啦~ 一.IP协议格式 1.1 4位版本号&#xff08;version&#xff09; 指定IP协议的版本&#xff0c;对于IPv4来说&#xff0c;就是4。 1.2 4位头部长度&#xff08;header length&#xff09; IP头部的…

HarmonyOS像素转换-如何使用像素单位设置组件的尺寸。

1 卡片介绍 基于像素单位&#xff0c;展示了像素单位的基本知识与像素转换API的使用。 2 标题 像素转换&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab介绍像素单位的基本知识与像素单位转换API的使用。通过像素转换案例&#xff0c;向开发者讲解了如何使用像素单位设…

【LeetCode热题100】【多维动态规划】最长公共子序列

我昨天面了天美L1的游戏客户端开发&#xff0c;面了我100分钟&#xff0c;问完实习、项目、计算机图形学和C后给了我两道算法题做&#xff0c;一道是最长公共子序列&#xff0c;一道是LRU缓存&#xff0c;我知道是经典的题目&#xff0c;但是我都没敲过&#xff0c;最长公共子序…

大数据-Hadoop---基础配置案例

VMware17创建新虚拟机&#xff1a; 1.静态设置与关闭防火墙 在终端命令行依次输入&#xff1a; 1&#xff09;cd /etc 2) ls 3) cd sysconfig/ 4) cd network-scripts/ 5) ls 6) vi ifcfg-nes33 在cmd命令栏输入&#xff1a;ncpa.cpl,是找网络适配器的命令 IPADDR&qu…

elementui el-input输入框类型为textarea时,将输入的数据保存换行和空格,并展示换行和空格

el-input输入框类型为textarea时&#xff0c;如果不做数据处理&#xff0c;是不会保存换行和空格的说输入了换行&#xff0c;但是保存数据后不会进行换行&#xff0c;需要保存输入的换行。 1、效果图 输入状态&#xff1a; 显示时&#xff1a; 2、实现代码 2.1、html部分&am…

在jupyter notebook中使用conda环境

在jupyter notebook中使用conda环境 1. 环境配置 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda install nb_cond…

在新能源充电桩、智能充电枪、储能等产品领域得到广泛应用的两款微功耗轨至轨运算放大器芯片——D8541和D8542

D8541和D8542是我们推荐的两款微功耗轨至轨运算放大器芯片&#xff0c;其中D8541为单运放&#xff0c; D8542为双运放&#xff0c;它特别适用于NTC温度采集电路、ADC基准电压电路、有源滤波器、电压跟随器、信号放大器等电路应用&#xff0c;在新能源充电桩、智能充电枪、…

网络编程--高并发服务器(二)

这里写目录标题 线程池高并发服务器UDP服务器TCP与UDP机制的对比TCP与UDP优缺点比较UDP的C/S模型实现思路模型分析实现思路&#xff08;对照TCP的C/S模型&#xff09; 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二…

【跟着CHATGPT学习硬件外设 | 05】I2C

本文根据博主设计的Prompt由CHATGPT生成&#xff0c;形成极简外设概念。 &#x1f680; 1. 概念揭秘 I2C&#xff08;Inter-Integrated Circuit&#xff09;&#xff0c;也被称为IIC或双线接口&#xff0c;是一种用于微控制器&#xff08;Microcontrollers&#xff09;和外设…

前端开发学习笔记(1)

文章目录 基础概念VSCode常用插件和快捷键VSCode常用插件VSCode常用快捷键 常用标签和属性 基础概念 网页和网站&#xff1a; 网页&#xff1a;网站中的一页&#xff0c;通常是HTML格式的文件。网页是由网页元素组成的&#xff0c;这些元素用HTML标签描述&#xff0c;然后通过…

用navicat进行mysql表结构同步

用navicat进行mysql表结构同步 前言新增一个列然后进行表结构同步删除一个列然后进行表结构同步把Int列转成TinyInt列&#xff0c;看数字溢出的情况下能不能表结构同步总结 前言 从同事那边了解到还能用navicat进行表结构同步&#xff0c;他会在发布更新的时候&#xff0c;直接…

如何在智能交通系统中使用物联网技术提高道路安全和效率

在智能交通系统中&#xff0c;物联网&#xff08;IoT&#xff09;技术可以通过多种方式提高道路安全和效率。以下是利用物联网技术提高智能交通系统效能的具体方法&#xff1a; 1. 车与路、车与车通信&#xff08;V2X&#xff09;&#xff1a;通过在道路上部署传感器和路侧单元…

Python基础之Class类的定义、继承、多态

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、class类1.类属性操作&#xff08;增删改&#xff09;2.类方法操作 二、类的继承1、语法2、方法重写 二、类的多态 一、class类 、三部分组成 1、类名&#xff…

Typescript再学习-接口interface声明函数(6)

话不多说&#xff0c;直接上代码 interface student {// 普通函数name(studentName: string): string;//箭头函数age: (studnetAge: number) > number; }let LiMing: student {// 普通函数name: function (studentName: string) {return studentName;},// 箭头函数age: (s…