POJ 1887 —— Testing the CATCHER 最长下降子序列
2016-03-07 20:47
323 查看
原题:http://poj.org/problem?id=1887
求最长下降子序列个数
注意输出格式!
O(n²)
O(nlogn)
求最长下降子序列个数
注意输出格式!
O(n²)
#include<cstdio> #include<algorithm> using namespace std; int dp[100000000]; int a[100000000]; int cas = 0; int main() { int tmp; while(~scanf("%d", &tmp)) { if(tmp == -1) break; int cnt = 0; a[cnt++] = tmp; while(1) { scanf("%d", &tmp); if(tmp == -1) break; a[cnt++] = tmp; } for(int i = 0;i<cnt;i++) dp[i] = 1; int ans = 1; for(int i = 1;i<cnt;i++) { for(int j = 0;j<i;j++) { if(a[i] < a[j] && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } ans = max(ans, dp[i]); } printf("Test #%d:\n", ++cas); printf(" maximum possible interceptions: %d\n\n", ans); } return 0; }
O(nlogn)
#include<cstdio> #define inf 99999999 int stack[100000000]; int cas = 0; int main() { int tmp; while(~scanf("%d", &tmp)) { if(tmp == -1) break; int top = 1; stack[1] = tmp; while(1) { scanf("%d", &tmp); if(tmp == -1) break; if(tmp < stack[top]) stack[++top] = tmp; else { int l = 1, r = top; int mid; while(l <= r) { mid = (l + r) / 2; if(tmp > stack[mid]) r = mid - 1; else l = mid + 1; } stack[l] = tmp; } } printf("Test #%d:\n", ++cas); printf(" maximum possible interceptions: %d\n\n",top); } return 0; }
相关文章推荐
- 在首席架构师眼里,架构的本质是……
- 【转载】【软件】Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)
- Java数组中常见有点难度的练习题
- 如何创建带子模块的Maven Web工程
- 一般处理程序
- Runtime那些事儿(消息机制)
- Spark学习笔记9-Spark Runtime
- 【hdu 5636】Shortest Path 中文题意&题解&代码(C++)
- java操作mongodb数据库
- invisible visible gone
- SpringMVC配置
- 图数据库neo4j初探
- 拉伸图片的几种方式
- 为什么会有面向对象编程的产生 [20160307]
- centos yum安装php5.6.19 remi源按照
- 六、高级套接字函数
- 关于Python的简介以及安装使用
- HDU 5638 Toposort
- Photoshop制作清晰的透明PNG图片的方法和技巧