hdu 5421 小明系列问题——小明序列(LIS最长上升子序列)
2016-07-29 18:17
471 查看
/***************************************************** 题目: 小明系列问题——小明序列(hdu 4521) 链接: http://acm.hdu.edu.cn/showproblem.php?pid=4521 算法: LIS最长上升子序列 ******************************************************/ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int mx=100005; int d[mx],dp[mx],a[mx]; queue<int>q; int BinSerch(int l,int r,int cut) { while (l<=r) { int m=(l+r)>>1; if (cut>d[m]&&cut<=d[m+1]) return m; if (cut>d[m]) l=m+1; else r=m-1; } return 0; } int LIS(int n,int k) { int len=1,j; fill(d,d+n+3,mx); d[1]=a[0]; for (int i=k+1;i<n;i++) { if (a[i]>d[len]) j=len+1; else j=BinSerch(1,len,a[i])+1; dp[i]=j; q.push(i); int cut=q.front(); q.pop(); d[dp[cut]]=min(a[cut],d[dp[cut]]); len=max(len,dp[cut]); } while (!q.empty()) { int cut=q.front(); q.pop(); len=max(len,dp[cut]); } return len; } int main() { int n,d; while (~scanf("%d%d",&n,&d)) { while (!q.empty()) q.pop(); for (int i=0;i<n;i++) scanf("%d",&a[i]); for (int i=1;i<=d;i++) { dp[i]=1; q.push(i); } printf("%d\n",LIS(n,d)); } }
相关文章推荐
- 给手势UITapGestureRecognizer绑定tag
- java反射基础
- Cannot create a server using the selected type
- 从远程库克隆
- NodeMCU之旅(三):响应配置按钮
- H264格式(转)
- 一篇关于什么是jsonp
- Graphviz -图形可视化,python实现
- 添加远程库
- hdu-1429胜利大逃亡(续)
- Vim - skill
- 小Y的棋盘问题 题解
- bzoj3307: 雨天的尾巴
- 远程仓库
- java动态代理
- UVA 11624 Fire!【BFS】
- java设计模式--AOP容器
- HDU 5074 Luck Competition (暴力,概率)
- [文章摘要] 社会科学和公共政策的空间化和GIS的应用
- 删除文件