最长完美子序列
来源:互联网 发布:万网 域名备案 编辑:程序博客网 时间:2024/06/04 01:08
最长完美子序列
时间限制: 1 Sec 内存限制: 128 MB
题目描述
如果一个序列,它的任意两个相邻的元素之差都不超过K,那么这个序列就被称作完美序列。
一个序列的子序列,就是从这个序列中,按照从前往后的顺序,取出任意多个数字(不一定连续)组成的新序列。
一个序列的完美子序列,就是从这个序列中取出一个子序列,且这个子序列是完美序列。
给定一个序列,求这个序列的最长完美子序列。输入
第一行两个整数n和K,n表示序列的长度。
第二行n个元素。输出
输出最长完美子序列的长度。
输入
1 5 4 10 7 4
输出
4
提示
样例解释:这个序列的子序列[1 4 7 4] 或者[5 4 7 4]都是完美序列。
对于30%的数据,n的范围[1,20];
对于50%的数据,n的范围[1,2000];
对于70%的数据,n的范围[1,20000],K和序列的中的元素范围[0,105];
对于100%的数据,n的范围[1,200000],K和序列的中的元素范围[0,109];
思路:
很容易得到状态转移方程:
dp[i]=max(dp[x]+1);(x满足x<i并且|a[x]-a[i]|<=k)
for(int i=1;i<=n;i++){ int mx=0; for(int j=1;j<i;j++) if(abs(a[i]-a[j])<=k)mx=max(mx,dp[j]); dp[i]=mx+1; ans=max(dp[i],ans); }printf("%d",ans);
于是可以使用线段树维护当前[a[i]-k,a[i]+k]dp值最大的
可是题目的数据范围为1e9所以需要离散
struct node{int l,r,mx;}s[M*4];solvs(){ for(int i=1;i<=n;i++)a[i]=ds[i]=rd(),dp[i]=1; //离散 sort(ds+1,ds+1+n); m=unique(ds+1,ds+1+n)-ds-1; build(1,m,1); for(int i=1;i<=n;i++){ //离散查询 int l=lower_bound(ds+1,ds+1+m,a[i]-k)-ds; int r=upper_bound(ds+1,ds+1+m,a[i]+k)-ds-1; int x=lower_bound(ds+1,ds+1+m,a[i])-ds; ans=query(l,r,1)+1; update(x,ans,1); }printf("%d",query(1,m,1));}
4 0
- 最长完美子序列
- 完美世界 最长递增子序列A
- 最长递增子序列A (完美2017实习生)
- 最长递增子序列B(完美2017实习生)
- 最长公共子序列
- 最长公共子序列
- 最长递增子序列
- 最长递增子序列
- 最长公共子序列
- 最长公共子序列
- 最长递增子序列
- 最长公共子序列...
- 最长上升子序列
- 最长公共子序列
- 最长公共子序列
- 最长递增子序列
- 最长下降子序列
- 最长递增子序列
- 设计模式--桥接模式
- 上传第三方jar包到maven远程仓库nexus
- storm从入门到精通 第四节 拓扑的并发
- USACO FEB 2002 CowCycling(奶牛玩具车队赛)
- js 获取浏览信息 及常见浏览器处理
- 最长完美子序列
- spring mvc redirect 重定向 跳转并传递参数 && mvc:view-controller直接转发页面
- androidhttp请求json数据缓存设计
- 植物大战僵尸
- 什么是Segmentation fault(Core Dump)? + 我遇到的实例问题
- 简洁的java环境变量的配置
- 秋冬心血管疾病高发,牢记这几个身体异常症状!
- 多线程聊天室提示
- 实时查询引擎 - Apache Drill 介绍与应用