【bzoj4282】【慎二的随机数列】【dp】
2016-01-04 19:56
281 查看
Description
间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列, 准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦
夕祸福,柳洞一成路过时把间桐慎二的水杯打翻了……
现在给你一个长度为 n 的整数序列,其中有一些数已经模糊不清了,现在请
你任意确定这些整数的值,使得最长上升子序列最长(为何最长呢?因为间桐慎
二向来对自己的人品很有信心) 。
Input
第一行一个正整数 n。接下来 n 行,第 i 行若为“K x” ,则表示第 i 个数可以辨认且这个数为 x;
若为“N” ,则表示第i 个数已经辨认不清了。
Output
第一行一个整数,表示最长的最长上升子序列长度。Sample Input
4K 1
N
K 2
K 3
Sample Output
3HINT
对于100%的数据,n ≤ 100000,|x| ≤ 10^9题解:
对于每个可以辨认的数,减去它之前不可辨认的数。构成一个新数列。这个新数列的lis加上不可辨认的数的个数就是答案啦。
代码:
#include<iostream> #include<cstdio> #define N 100010 using namespace std; int q ,sum,n,s ,top,t,x; char ch[10]; int main(){ scanf("%d",&n); for (int i=1;i<=n;i++){ scanf("%s",ch); if (ch[0]=='K'){scanf("%d",&x);q[++t]=x-sum;} if (ch[0]=='N') sum++; } s[0]=-999999999; for (int i=1;i<=t;i++) if (q[i]>s[top]) s[++top]=q[i]; else{ int l=1,r=top; while (l<=r){int mid=(l+r)>>1;if (q[i]>s[mid])l=mid+1;else r=mid-1;} s[l]=q[i]; } cout<<top+sum<<endl; }
相关文章推荐
- 通过HttpURLConnection模拟post表单提交
- 让测试团队慢慢死去!
- statistics specify some columns count
- 调用相机和手机拍照
- 通过 ssh tunnel 连接 远程mysql数据库
- 多屏幕适配
- 学习 Java UDP 小结
- TCP/IP详解--连接状态变迁图CLOSE_WAIT
- linux rename命令批量修改文件名
- IOS开发初体验
- CocoaPods安装及使用
- lua和c的交互
- IOS开发初体验
- hdu1028
- 【学习笔记javascript设计模式与开发实践(装饰者模式)----15】
- 产品经理如何开始数据分析之路?(基础知识)
- win8不显示图片缩略图的解决方法
- 【iOS】数据库SQLite3的使用
- JSON 的解析
- Linux内核工程导论——网络:Netfilter概览