LID&LDS 的另外一种算法
2024-09-05 10:59:05
然后讲讲我的想法: 有结论不上升子序列的个数=最长上升子序列的长度.....至于为什么,在下面讲
上代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
class P
{
public:
int x,id; //x为数的大小,id为标记
}a[];
int main()
{
int n,i,j,number,minn,b[];
while(~scanf("%d",&n))
{
memset(a,,sizeof(a));
for(i=;i<n;i++)
scanf("%d",&a[i].x);
number=;
printf("LIS:\n");
for(i=;i<n;i++)
if(a[i].id==) //未被标记 ①
{
number++; //组数+1
a[i].id=number; //标记为组的编号 ②
minn=a[i].x; //更新最小值
for(j=i+;j<n;j++)
{
if(a[j].id== && a[j].x<=minn) //未被白标记且不大于最小值 ③
{
a[j].id=number; //标记为组编号
minn=a[j].x; //更新最小值 ④
}
}
}
for(i=n-,j=number;i>=;i--)
{
if(a[i].id==j) //找到满足编号及大小的数 ⑤
{
b[j]=a[i].x;
j--; //组编号-1
}
}
for(i=;i<=number;i++) ⑥
printf("%d ",b[i]);
printf("\nLIS number:");
printf("%d\n",number);
}
return ;
}
从第一个数据开始,找到第一个未被标记的数①,记录组编号,并标记为组编号②,再在这个数之后找未被标记的<=它的数③,标记为组编号,并更新最小值④,循环。
最后从最后一个数扫描,标记=编号--⑤的第一个数就记录下来,在就是正序输出这些数⑥。
例: 数组:9 10 6 7 2 1 8 4 3 5
组的编号: 1 2 1 2 1 1 3 2 2 3
从最后一个扫描,找到第一个编号为3的数:5
再找编号为2 的数:3
再找编号为1的数:1
所以顺序输出为1 3 5,长度3
从上得知,每一组出一个数组成最长上升子序列,这就是为什么最长上升子序列的长度=不上升子序列的个数了~~~
本来只是用来做俄罗斯套娃这道题,后来发现做导弹拦截系统这道题也可以,再发现就是求最长上升子序列,后来想办法把上升序列打出来,中间当然有很多错误,两个人慢慢讨论,一点点完善,修改,测试,就有个这段代码。
还是不懂的翻到最前面,戳进那个网页~\(≧▽≦)/~啦啦啦
最新文章
- 构建基于Chromium的应用程序
- Android 通过 Intent 传递类对象或list对象
- Basic linux command-with detailed sample
- NLog的使用
- SpringAOP使用扩展
- 解决SecureCRT中文编码乱码
- eclipse颜色 字体
- 获取手机IMEI 号和 IP
- Sql 语句添加字段、修改字段类型、默认值语法
- 超炫HTML5 SVG聊天框拖拽弹性摇摆动画特效
- I’m stuck!
- 【Android Developers Training】 105. 显示一个位置地址
- java集合系列——Map介绍(七)
- 分治法——归并排序(mergesort)
- tensorflow object detection
- MySQL加载配置文件的顺序
- 关于thymeleaf+layout布局的使用方式,spring boot 访问页面(静态页面及jsp页面)
- bzoj 1390: [Ceoi2008]Fence
- 学习笔记之Bitbucket
- 洛谷 P3190 [HNOI2007]神奇游乐园 解题报告