HDU 5773 The All-purpose Zero (变形LIS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5773

0可以改变成任何数,问你严格递增的子序列最长是多少。

猜测0一定在最长上升子序列中用到,比如2 0 0 3 5 6,可以变为2 3 4 3 5 6。

那我们先算出0的个数,然后每次遇到0就把后面一开始不是0的-1,算出剩下数的最长上升子序列(nlogn),然后加上0的个数。

 //#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e5 + ;
int inf = 0x3f3f3f3f;
int a[N], dp[N], b[N]; // dp[i]:长度为i的上升子序列中最后元素的最小值 int main()
{
int t, n;
scanf("%d", &t);
for(int ca = ; ca <= t; ++ca) {
scanf("%d", &n);
int dec = , index = ;
for(int i = ; i <= n; ++i) {
scanf("%d", a + i);
if(a[i] == ) {
++dec;
} else {
a[i] -= dec;
b[++index] = a[i];
}
dp[i] = inf;
}
for(int i = ; i <= index; ++i) {
*lower_bound(dp + , dp + index + , b[i]) = b[i];
}
printf("Case #%d: %d\n", ca, lower_bound(dp + , dp + n + , inf) - dp - + dec);
}
return ;
}
上一篇:Vue结合Element UI实战


下一篇:【PAT】B1003 我要通过!