[DP LIS] BZOJ 4282 慎二的随机数列
2016-04-07 19:35
387 查看
显然随机的数全部属于上升序列肯定能构造出最优解,那么直接认为随机的数都在最优解中。
如果是求最长不上升子序列的话就直接去掉所有的随机数求一遍然后加上随机数的个数。
现在是让求最长上升子序列,只需把每个数都减去前面随机的数的个数然后求一遍再加上随机数的个数即为答案!
如果是求最长不上升子序列的话就直接去掉所有的随机数求一遍然后加上随机数的个数。
现在是让求最长上升子序列,只需把每个数都减去前面随机的数的个数然后求一遍再加上随机数的个数即为答案!
#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++; } inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; } inline void read(char &x){ for (x=nc();x!='K' && x!='N';x=nc()); } int n,a[100005]; int c[100005],len; int main() { int in,icnt=0; char order; freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(in); for (int i=1;i<=in;i++) { read(order); if (order=='N') icnt++; else read(a[++n]),a -=icnt; } c[++len]=a[1]; for (int i=2;i<=n;i++) { if (a[i]>c[len]){ c[++len]=a[i]; continue; } int iter=lower_bound(c+1,c+len+1,a[i])-c; c[iter]=a[i]; } printf("%d\n",len+icnt); return 0; }
相关文章推荐
- 关于安卓长度单位计算方法
- mybatis insert 空属性用trim suffix="" suffixOverrides=","去多余的“,”
- boson netsim5.31平台上组建交换式网络
- Spring MVC 解读——<mvc:annotation-driven/>
- ${param.name}和${requestScope.name}小区别,及用处
- [BZOJ2818]Gcd(莫比乌斯反演)
- 61. Rotate List
- 方法和构造方法的区别。
- 第一周周记
- 深度优先搜索
- UVA 10294 poj 3270 置换问题
- SPI总线的特点、工作方式介绍
- hdu4975A simple Gaussian elimination problem.【网络流判断是否解唯一】
- 顺序结构存储串实现串通配符匹配的算法
- 剑指offer-面试题6.重建二叉树
- 第七周一周总结
- spring 配置文件中的占位符 使用 context:property-placeholder
- Java Script之创建对象
- 博弈论的总结
- 技术贴