博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ-2533 Longest Ordered Subsequence
阅读量:4705 次
发布时间:2019-06-10

本文共 1635 字,大约阅读时间需要 5 分钟。

该题是最裸的LIS题,这里有两种方法。

代码如下:

#include 
#include
#include
using namespace std; int a[10000], dp[10004]; int main() {
int N; while (scanf("%d", &N) == 1) {
int ans = 1, m; for (int i = 0; i < N; ++i) {
scanf("%d", a+i); } dp[0] = 1; for (int i = 1; i < N; ++i) {
m = 0; for (int j = 0; j < i; ++j) {
if (a[i] > a[j] && dp[j] > m) {
m = dp[j]; } } dp[i] = m+1; ans = max(ans, dp[i]); } printf("%d\n", ans); } }

二分优化后的写法,数组c[i]保留长度为i的上升串的末尾最小元素。

代码如下:

#include 
#include
#include
#define MAXN 10000 using namespace std; int a[MAXN+5]; int bsearch(int *c, int l, int r, int val) {
int mid; while (l <= r) {
mid = (l+r)>>1; if (val > c[mid]) l = mid + 1; else if (val < c[mid]) r = mid - 1; else // 如果不是严格的递增序列的话,二分查找时,相等视为后者比其大 return mid; } return l; } int LIS(int *a, int N) {
int c[MAXN], size = 1, pos; c[1] = a[0]; for (int i = 1; i < N; ++i) {
if (a[i]>c[size]) pos = ++size; else pos = bsearch(c, 1, size, a[i]); // 返回比该值稍微大的点 c[pos] = a[i]; } return size; } int main() {
int N; while (scanf("%d", &N) == 1) {
for (int i = 0; i < N; ++i) {
scanf("%d", &a[i]); } printf("%d\n", LIS(a, N)); } }

转载于:https://www.cnblogs.com/Lyush/archive/2012/03/03/2378430.html

你可能感兴趣的文章
httpclient设置proxy与proxyselector
查看>>
IT常用单词
查看>>
拓扑排序
查看>>
NYOJ--32--SEARCH--组合数
查看>>
JMS
查看>>
gulpfile 压缩模板
查看>>
【34.14%】【BZOJ 3110】 [Zjoi2013]K大数查询
查看>>
【 henuacm2016级暑期训练-动态规划专题 A 】Cards
查看>>
第五篇:白话tornado源码之褪去模板的外衣
查看>>
设备常用框架framework
查看>>
bootstrap模态框和select2合用时input无法获取焦点(转)
查看>>
MockObject
查看>>
BZOJ4516: [Sdoi2016]生成魔咒(后缀自动机)
查看>>
查看手机已经记住的WIFI密码
查看>>
最新版IntelliJ IDEA2019 破解教程(2019.08.07-情人节更新)
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
关于oracle样例数据库emp、dept、salgrade的mysql脚本复杂查询分析
查看>>
adb shell am 的用法
查看>>
iOS10 UI教程视图和子视图的可见性
查看>>
FindChildControl与FindComponent
查看>>