P1233 木棍加工(最长不下降子序列)
哇,这道题真有意思,这道题和最直接的单调子序列不同,在空间上是二维的,有两个变量,
然而如果将其中一个变量排序后呢?是不是恍然大悟的感觉^_^
思路就是将一个按递减变量排序后,该变量从左到右一定是单调了,只需要考虑另一个变量的最长不下降子序列长度即可
和导弹那道经典题目思路有点像
代码:
#include<iostream> #include<string> #include<stack> #include<stdio.h> #include<queue> #include<string.h> #include<map> #include<unordered_map> #include<vector> #include<iomanip> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 1e4 + 100; inline ll r() { ll f = 1, num = 0; char ch = getchar(); while (0 == isdigit(ch)) { if (ch == '-')f = -1; ch = getchar(); } while (0 != isdigit(ch)) num = (num << 1) + (num << 3) + ch - '0', ch = getchar(); return num * f; } int c[maxn][maxn]; int mod = 1000007; int n, m; int num[maxn]; struct node { int w, l; bool operator<(node b)const { if (w != b.w) { return w > b.w; } else { return l > b.l; } } }v[maxn]; int d[maxn]; int len; int main() { //freopen("test.txt", "r", stdin); n = r(); for (int i = 1; i <= n; i++) { v[i].l = r(), v[i].w = r(); } sort(v + 1, v + n + 1); for (int i = 1; i <= n; i++) { if (d[len] < v[i].l) { d[++len] = v[i].l; } else { int pos = lower_bound(d + 1, d + len + 1, v[i].l) - d;//昨天刚学的logn方法,哈哈 d[pos] = v[i].l; } } cout << len << endl; return 0; }

浙公网安备 33010602011771号