当前位置:网站首页>信息学奥赛一本通(1259:【例9.3】求最长不下降序列)
信息学奥赛一本通(1259:【例9.3】求最长不下降序列)
2022-08-02 20:02:00 【橙子教师】
1259:【例9.3】求最长不下降序列
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 22932 通过数: 8116 Special Judge
【题目描述】
设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)若存在i1<i2<i3<…<ie且有b(i1)<=b(i2)<=…<=b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。
例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为7的不下降序列,同时也有7 ,9,16,18,19,21,22,63组成的长度为8的不下降序列。
【输入】
第一行为n,第二行为用空格隔开的n个整数。
【输出】
第一行为输出最大个数max(形式见样例);
第二行为max个整数形成的不下降序列,答案可能不唯一,输出一种就可以了,本题进行特殊评测。
【输入样例】
14
13 7 9 16 38 24 37 18 44 19 21 22 63 15【输出样例】
max=8
7 9 16 18 19 21 22 63【分析】
根据动态规划的原理,由后往前进行搜索(当然从前往后也一样)。
(1)对a[n]来说,由于它是最后一个数,所以当从 a[n]开始查找时,只存在长度为1的不下降序列;
(2)若从a[n-1]开始查找,则存在下面的两种可能性∶
①若a[n-1]<a[n],则存在长度为2的不下降序列a[n-1],a[n]。
②若a[n-1]>a[n],则存在长度为1的不下降序列a[n-1]或a[n]。
(3)一般若从a[i]开始,此时最长不下降序列应该按下列方法求出:
在a[i+1],a[i+2],…,a[n]中,找出一个比 a[i]大的且最长的不下降序列,作为它的后继。
【数据结构】
为算法上的需要,定义三个整型数组(也可以定义一个整数类型二维数组b[n][3])
(1)a[i]:表示第 i 个数的数值本身。
(2)f[i]:表示从 i 位置到达n的最长不下降序列长度。
(3)p[i]:表示从 i 位置开始最长不下降序列的下一个位置,若p[i]=0,则表示后面没有连接项。
【动规分析】
(1)划分阶段。
阶段:根据p数组,即最长不下降序列的位置来划分阶段。
(2)确定状态和状态变量。
状态:f 数组的中值表示从第 i 位置到达 n 的最长不下降长度,都是不同的状态,状态信息用f[i]表示。
(2)确定决策并写出状态转移方程。
f[i]的值从哪来?当然是从f[j]而来,i<j≤n,策略:不下降,即a[i]≤a[j]。故:
状态转移方程: f[i]=max{ f[j]+1 | i<j≤n, a[i]≤a[j] }。
(4)寻找边界条件。
边界:f[n]=1,p[n]=0。
(5)设计并实现程序,数据存储和问题求解过程如下:

【参考代码】
#include <stdio.h>
#define MAXN 210
int a[MAXN]; //数据存储数组
int f[MAXN]; //最长不下降子序列数组,f[i]表示从i位置到达n的最长不下降序列长度
int p[MAXN]; //位置数组,从i位置开始最长不下降序列的下一个位置
int main()
{
int i,j;
int n; //数列长度
int maxn; //以某数为起点的最长不降序列
int k;
int ans=0; //最终结果
int s; //s起始位置
scanf("%d",&n);
for(i=1;i<=n;i++) //输入序列的初始值
scanf("%d",&a[i]);
f[n]=1;
p[n]=0;
for(i=n-1;i>=1;i--) //逆序求最长不下降序列
{
maxn=0;
k=0;
for(j=i+1;j<=n;j++)
{
if(a[i]<=a[j] && f[j]>maxn)
{
maxn=f[j];
k=j;
}
}
if(maxn>=0)
{
f[i]=maxn+1;
p[i]=k;
}
}
for(i=1;i<=n;i++) //求最长不下降序列起始位置
{
if(f[i]>ans)
{
ans=f[i];
s=i;
}
}
printf("max=%d\n",ans); //输出结果
while(s!=0) //输出最长不下降序列
{
printf("%d ",a[s]);
s=p[s];
}
return 0;
}边栏推荐
猜你喜欢
![[AnXun cup 2019] easy_web](/img/26/c04bc8b9c65ac75ddd2696b48e1661.png)
[AnXun cup 2019] easy_web

ssdp协议搜索GB28181设备

基于 outline 实现头像剪裁以及预览

J9 digital theory: the Internet across chain bridge has what effect?

TPAMI2022 | TransCL: based on the study the compression of the Transformer, more flexible and more powerful

谷歌竞价机器学习如何去理解?

Three.js入门

Parse the commonly used methods in the List interface that are overridden by subclasses
Solve the docker mysql can't write Chinese

实现客户服务自助,打造产品知识库
随机推荐
Linphone 被叫方如何解析来电SIP消息中的自定义头消息
网络协议介绍
【StoneDB性能相关工具】内存监控
Meta 与苹果的元宇宙碰撞
Golang source code analysis: juju/ratelimit
扫码预约 | 观看Apache Linkis数据处理实践以及计算治理能力
第一次进入前20名
What is a Field Service Management System (FSM)?what is the benefit?
shell:条件语句
特拉维夫大学 | Efficient Long-Text Understanding with Short-Text Models(使用短文本模型进行高效的长文本理解)
4KMILES加入艾盛集团,以更强劲的数字商务能力,加速中国跨境电商的全域全效增长
The time series database has been developed for 5 years. What problem does it need to solve?
Qt提升自定义控件,找不到头文件
对话亚洲高校首个博士论文奖-裘捷中丨KDD2022
笑话:如果你在河边等待得足够久,你会看到你的敌人的尸体漂过,是怎么翻译出来的?
【LeetCode】1374. 生成每种字符都是奇数个的字符串
Redis cluster configuration
MOSN 反向通道详解
什么是乙二醇二乙酸酯(EGDA)?
Office2021 安装MathType