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;
}

 

posted @ 2021-01-31 16:37  cono奇犽哒  阅读(130)  评论(0)    收藏  举报