hdu1160--最长有序子序列
数组a[]为待处理数组
f[]用于记录a[]数组中,以对应位置数据为结尾的最长有序序列长度
p[]用于记录a[]数组中,以对应位置数据为结尾的前一个数据位置
使用position记录最大长度位置
以a[]={1,4,7,2,5,8,3,6,9},计算最长递增有序子序列为例
初始化f[]={1, 1, 1, 1, 1, 1, 1,1,1},p[]={0,1,2,3,4,5,6,7,8}
计算f[i]时,f[i]=max(f[j]+1) ,(其中,a[i]>a[j],i>j>=0),意思是以a[i]为结尾,找出在a[i]前比a[i]小的数据中以该数据为结尾的最大有序子序列长度max(f[j]),则以a[i]结尾的最大有序子序列长度为max(f[j])+1。计算同时定义p[i]=j,标志a[i]为结尾的最长子序列的前一个数据a[j]的位置。同时判断此时最大长度a[i]是否比当前最大长度max大,如果a[i]更大则更新position
a[]={1,4,7,2,5,8,3,6,9}
i=0 f[]={1,1,1,1,1,1,1,1,1}, p[]={0,1,2,3,4,5,6,7,8}
i=1 f[]={1,2,1,1,1,1,1,1,1}, p[]={0,0,2,3,4,5,6,7,8} 4>1,所以最大长度为2,position=1
i=2 f[]={1,2,3,1,1,1,1,1,1}, p[]={0,0,1,3,4,5,6,7,8} 7>4,7>1 其中4结尾的长度为2,所以最大长度为3,position=2
i=3 f[]={1,2,3,2,1,1,1,1,1}, p[]={0,0,1,0,4,5,6,7,8} 2>1 所以最大长度为2
i=4 f[]={1,2,3,2,3,1,1,1,1}, p[]={0,0,1,0,1,5,6,7,8} 5>1,5>4,5>2,其中以4结尾的长度为2,所以最大长度为3
i=5 f[]={1,2,3,2,3,4,1,1,1}, p[]={0,0,1,0,1,2,6,7,8} 8比前面的数据都大,所以最大长度为4,position=5
i=6 f[]={1,2,3,2,3,4,3,1,1}, p[]={0,0,1,0,1,2,3,7,8} 3>1,3>2,其中以2结尾的长度为2,所以最大长度为3
i=7 f[]={1,2,3,2,3,4,3,4,1}, p[]={0,0,1,0,1,2,3,4,8} 6>1,6>4,6>2,6>5,6>3,其中以5结尾长度为3,所以最大长度为4
i=8 f[]={1,2,3,2,3,4,3,4,5}, p[]={0,0,1,0,1,2,3,4,5} 9比前面数据都大,所以最大长度为5,position=8
在对所有a中元素循环过后,通过max记录下最后数据位置,以及p记录的前一个数据的位置,可以递归求出LIS
#include<stdio.h> #include<algorithm> using namespace std; int f[10001]; int p[10001]; struct Mouse { int w; int s; int n; } M[10001]; bool compare(const Mouse &a, const Mouse &b) { if(a.w==b.w) return a.s > b.s; else return a.w < b.w; } void printLIS(int max_l) { if(p[max_l]==max_l) { printf("%d\n",M[max_l].n); return; } printLIS(p[max_l]); printf("%d\n",M[max_l].n); } int main() { int i=1,max=0,max_l=0; while(scanf("%d %d",&M[i].w,&M[i].s)!=EOF) { f[i]=1; p[i]=i; M[i].n=i; i++; } sort(M+1,M+i,compare); for(int k=1; k<i+1; k++) { for(int j=1; j<k; j++) { if(M[j].s>M[k].s&&M[j].w<M[k].w) { if((f[j]+1)>f[k]) { f[k]=f[j]+1; p[k]=j; if(f[k]>max) { max = f[k]; max_l = k; } } } } } printf("%d\n",max); printLIS(max_l); return 0; }
相关文章
- 在 Go 里用 CGO?这 7 个问题你要关注!
- 9款优秀的去中心化通讯软件 Matrix 的客户端
- 求职数据分析,项目经验该怎么写
- 在OKR中,我看到了数据驱动业务的未来
- 火山引擎云原生大数据在金融行业的实践
- OpenHarmony富设备移植指南(二)—从postmarketOS获取移植资源
- 《数据成熟度指数》报告:64%的企业领袖认为大多数员工“不懂数据”
- OpenHarmony 小型系统兼容性测试指南
- 肯睿中国(Cloudera):2023年企业数字战略三大趋势预测
- 适用于 Linux 的十大命令行游戏
- GNOME 截图工具的新旧截图方式
- System76 即将推出的 COSMIC 桌面正在酝酿大变化
- 2GB 内存 8GB 存储即可流畅运行,Windows 11 极致精简版系统 Tiny11 发布
- 迎接 ecode:一个即将推出的具有全新图形用户界面框架的现代、轻量级代码编辑器
- loongarch架构介绍(三)—地址翻译
- Go 语言怎么解决编译器错误“err is shadowed during return”?
- 敏捷:可能被开发人员遗忘的部分
- Denodo预测2023年数据管理和分析的未来
- 利用数据推动可持续发展
- 在 Vue3 中实现 React 原生 Hooks(useState、useEffect),深入理解 React Hooks 的