设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

算法————设计一个O(N^2)时间复杂度的算法,找出由n个数组成序列的最长单调递增序列 关于这道题,其实就是利用动态规划的一种思想,解这道题有点类似冒泡,采用遍历数组序列,不断更新递增序列的长度以至于来找到最长单调递增序列。 关于问题呢,大概已有有一点思路: 下面将思路画一画,通过将思想的整理,得到这样一副图: 通过图片我们可以看出要想找到最长递增子序列,我们得不断扩大范围这里是指图片中的(sub[i]所对应的区间),其实也就在小区间得到递增的序列的长度,然后继续扩大区间来... 阅读详情

题目如下:

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

解题思路:

思路一:简单dp,求最长递增子序列,即为求其与已经排好序的序列的公共子序列


/*设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。*/
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define N 100

void fun(int n);

vector< int > a,b;

void main()
{
	int i,n,temp;
	printf("input n:");
	scanf("%d",&n);
	printf("input the array.\n");
	for(i=0;i<n&&cin>>temp;i++)
		a.push_back(temp);
	b=a;
	sort(b.begin(),b.end());
	fun(n);

}

void fun(int n)
{
	int m[N][N],flag[N];
	if(a[0]!=b[0])
		m[0][0]=0;
	else
		m[0][0]=1;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i==0&&j==0)
			{
				continue;
			}
			if(a[i]==b[j])
			{
				if(i==0)
					m[i][j]=m[0][j-1]+1;
				else if(j==0)
					m[i][j]=m[i-1][0]+1;
				else
				    m[i][j]=m[i-1][j-1]+1;
			}
			else
			{
				if(i==0)
					m[i][j]=m[i][j-1];
				else if(j==0)
					m[i][j]=m[i-1][j];
				else
					m[i][j]=(m[i-1][j]>m[i][j-1]?m[i-1][j]:m[i][j-1]);
			}
		}
	}
	for(int k=n-1;k>=0;k--)
	{
		if(k==0&&m[0][0]!=0)
			flag[k]=1;
		else if(m[k][k]>m[k-1][k-1])
			flag[k]=1;
		else
			flag[k]=0;
	}
	cout<<"len="<<m[n-1][n-1]<<endl;
	cout<<"the number are:";
	for(int h=0;h<n;h++)
	{
		if(flag[h])
		{
			cout<<a[h]<<" ";
		}
	}
	cout<<endl;
		
}


第二种思路

/*设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。*/
#include <stdio.h>
#define N 100

void prin(int i);
void fun(int n);
int p[N],a[N];

void main()
{
	int i,n;
	printf("input n:");
	scanf("%d",&n);
	printf("input the array.\n");
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	fun(n);

}

void fun(int n)
{
	int m[N];
	int i,k,max;
	m[0]=1;
	p[0]=-1;
	for(i=1;i<n;i++)
	{
		max=0;
		p[i]=-1;
		for(k=0;k<i;k++)
		{
			if(m[k]>max&&a[k]<a[i])
			{
				p[i]=k;
				max=m[k];                   
			}
		}
		m[i]=max+1;
	}
	i=0;
	for(k=1;k<n;k++)
	{
		if(m[k]>m[i])
		{
			i=k;
		}
	}	
	prin(i);
	printf("\nlen=%d\n",m[i]);

}

void prin(int i)
{
	if(p[i]<0)
	{
		printf("%d",a[i]);
		return;
	}
	prin(p[i]);
	printf(",%d",a[i]);
}



设计一个O(n^2)时间的算法,找出由n个数字组成的序列的最长单调递增子序列。 题目描述:设计一个O(n^2)时间的算法,找出由n个数字组成的序列的最长单调递增子序列。要求:(1)写出分析思路;(2)给出具体算法。 分析思路 从所给数组的第一个数开始,向后依次计算以此元素开始的最长单调递增子序列的长度,将此长度记录在max中,找出max的最大值,并将该递增序列的首元素的下标记录在c中,最后依序输出。 具体算法 输出的序列为连续的: #include&amp;... 阅读详情

相关推荐

单调递增序列

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列。

设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列。 代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { //时间复杂度为O(n2):两层循环,外层最大循环次数n,内层最大循环次数n,最大共计n2,也称平方阶 //设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列。 //最长递增子序列(Longest Increasing Subsequence

weixin_43474701的博客 5076

COMSOL中的动网格

首先我们先了解几个概念 (1)网格重划分(remesh):就是在某些特定的区域进行网格的重新划分,在Maxwell软件中的直线运动区域,当运动物体运动后,这个区域进行重新划分。 (2)morph:网格不重新划分,小范围的进行网格变形,针对运动物体运动位移较小,对变形区域不进行重划分,能够提高效率。 (3)网格滑移(sliding):针对圆形运动区域,运动与非运动区域进行网格滑移,当然边界上两侧网格不共节点,该方法不需要网格重新划分,大部分软件针对圆形运动区域采用该方法,比如maxwell的band,b

midiio的博客 7869

设计一个O(n^2)时间的算法,找出由n个数组成的最长单调递增子序列。

#include<iostream> using namespace std; int main() { int sum=0,a[10],max=0,i=0,j,first,last; cout<<"请输入10个数:"<<endl; for(int b=0;b<10;b++) { cin>>a[b]; } for...

younger_to_older的博客 5076

用AG9311芯片DIY一个多功能Type-C扩展坞:从原理图到PCB布局的保姆级指南

本文详细介绍了如何利用AG9311芯片DIY多功能Type-C扩展坞,涵盖从原理图设计到PCB布局的全过程。AG9311芯片作为高性价比的Type-C控制器,支持HDMI 2.0、USB 3.0、PD快充和千兆网口,适合硬件爱好者打造个性化扩展坞。文章还提供了调试技巧和进阶优化建议,帮助读者轻松完成项目。

weixin_42520909的博客 404

Depth Anything 3实战:如何用DINOv2 Transformer一键生成3D高斯点云?

本文详细介绍了Depth Anything 3(DA3)模型如何利用DINOv2 Transformer架构,实现从单张或多视角图像一键生成高质量3D高斯点云。DA3通过统一的深度-射线表示和自适应注意力机制,简化了传统复杂的3D重建流程,并可直接微调用于3D高斯渲染,为图形学、CV和内容创作领域提供了高效的端到端解决方案。

postgres8guard的博客 722

c语言求最长单调子序列,设计一个O(n2)时间算法,找出由n个数组成的序列的最长单调递增子序列...

满意答案dfjordan232017.10.23采纳率:55%等级:10已帮助:466人算法导论15.4-5 请给出一个O(n^2)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。这个题目是在动态规划部分,此处显然是要用到动态规划。我们知道可以使用动态规划思想的问题的的两个重要的特征是具有最优子结构和重叠子问题。下面就来分析一下这个问题:对于一个n个元素的序列nums,设其...

weixin_34990053的博客 2309

FFmpeg音频转换避坑实录:为什么VOS的REC转MP3比WAV转MP3体积小一半?

本文深入解析了FFmpeg在VOS系统REC格式音频转换中的优化技巧,揭示了REC转MP3比WAV转MP3体积小一半的原因。通过分析REC格式的压缩特性、转码参数陷阱及FFmpeg调优方法,帮助开发者实现高效音频转换,显著降低存储成本。

weixin_30752699的博客 526

7-1 单调递增最长子序列 (20分)

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开 输出格式: 最长单调递增子序列的长度 输入样例: 在这里给出一组输入。例如: 5 1 3 5 2 9 输出样例: 在这里给出相应的输出。例如: 4 #include<iostream> using namespace std; int main(){ int i,j,n; cin>>n; int a

Suzerk的博客 1704

HyperMesh实战:用Field工具搞定复杂载荷映射(附TCL脚本示例)

本文深入探讨了HyperMesh中Field工具在复杂载荷映射中的高级应用,包括从CSV到有限元网格的温度场映射全流程、稀疏数据处理技巧及TCL自动化脚本示例。通过Field工具,工程师可以高效实现CFD温度场到结构网格的精准映射,显著提升有限元分析的精度与效率。

white的博客 265

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 412

p-7-20单调递增最长子序列

1. 题目描述 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。 2. 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开 3.输出格式: 最长单调递增子序列的长度 4.输入样例: 在这里给出一组输入。例如: 5 1 3 5 2 9 5.输出样例: 在这里给出相应的输出。例如: 4 6. 解题思路 请看如下......

qq_43192537的博客 355

TOD和PPS精确时间同步技术

授时

u010783226的专栏 1万+

设计算法找出n个数组成的序列的最长单调递增子序列(c语言算法设计)

设计算法找出n个数组成的序列的最长单调递增子序列 问题:设计一个O(n^2)时间算法,找出由n个数组成的序列的最长单调递增子序列。 C语言实现如下: #include<stdio.h> #include<stdlib.h> void find_max_str(int str[],int length); int main() { int b, c; int str[] = { 2,1,4,7,8,-1,20,-7,6,8,10,45,43,2 }; find_max_str(s

m0_46428731的博客 3520

Matterport3D数据集介绍与下载(全网最详细)

Matterport3D数据集介绍与下载(全网最详细)

shannanshouyin的博客 2165

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

动态规划作业 最长单调递增子序列

动态规划作业 最长单调递增子序列 设计一个 O(n2)时间的算法,找出由 n 个数组成的序列 a 的最长单调递增子 序列。 提示:用数组 b[0:n]纪录以 a[i] (0<= i< n),为结尾元素的最长递增子序列的 长度。将计算 b[i]转化为 i 个规模更小的子问题。 ■ Input 第一行包含一个整数,表示数组 a 的长度。 接下来的一行,包含 n 个数,依次表示 a[i]。 ■ Output 输出一行表示对应的答案。 Sample: ■ Sample Input 1 52 9 3 7

ChaoYue_miku的博客 6068

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

PTA 3 单调递增最长子序列(动态规划)

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开 输出格式: 最长单调递增子序列的长度 输入样例: 在这里给出一组输入。例如: 5 1 3 5 2 9 结尾无空行 输出样例: 在这里给出相应的输出。例如: 4 结尾无空行 分析: 接着上一道题,它们一样但有不太一样。因为是要求单调递增的,所以分析的时候就多了一个条件。这道题直接用一维数组来解决,设d[

我的博客 1162

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NYOJ 17 (最长单调递增子序列) O (n*n) + O(n*lgn)

最长单调递增子序列  应该算是比较经典的问题  记录一下我写这道题的过程吧  首先转换成lcs的做法 我就不说了 我觉得很内个啥 你懂吧 就复杂度依然是n方  很麻烦的方法  方法一 动态规划  O(n*n) 思路是这样的  定义dp[i] 为在I点结束的最长单调递增子序列的长度   所以可以便利一遍数组 每次都把之前的东西都找一遍 尝试增大  就这样 #include

看起来喜欢做枯燥事情的人或许只是更清楚自己想要什么罢了 442

单调递增最长子序列(动态规划法)

单调递增最长子序列题目答案 题目 设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。 输入格式: 输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开 输出格式: 最长单调递增子序列的长度 输入样例: 在这里给出一组输入。例如: 5 1 3 5 2 9 输出样例: 在这里给出相应的输出。例如: 4 答案 #include<bits/stdc++.h> using namespace std; int main() { int n;

ljhsq的博客 931

最长单调递增子序列

问题:设计一个O(n^2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。方法一:最长公共子序列,动态规划。思路:1:将数组a复制到b;           2:对b排序;           3:对数组b去重(注意去重是必要的,因为要求单调递增),这里利用hash表去重。             4:求a, b数组的最长公共子序列。           求最长公共子序列方法见 https...

HHHHHHep的博客 1657

最长单调递增子序列--动态规划

最长单调递增子序列定义: 问题描述: 设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列。 输入 第1个整数n(0<n<100),表示后面有n个数据,全部为整数。 输出 输出最长单调递增子序列的长度; 样例输入 8 65 158 170 155 239 300 207 389 样例输出 6 算法描述: 计算最长递增子序列的动态规划算法 #define NUM 100 int a[NUM];      //序列L int LIS_n2(int n)     {  in

Woo~ 4291

算法导论 习题15.4-5 15.4-6 找出一个n个数的序列中最长的单调递增子序列

算法导论15.4-5 请给出一个O(n^2)时间的算法,使之能找出一个n个数的序列中最长的单调递增子序列。 这个题目是在动态规划部分,此处显然是要用到动态规划。 我们知道可以使用动态规划思想的问题的的两个重要的特征是具有最优子结构和重叠子问题。

程序缘 1万+
上一篇: 动态规划解0-1背包问题
下一篇: 最小生成树——解题报告
EmanuelBlog
博客等级 码龄15年 19粉丝 27原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值