POJ 1065 Wooden Sticks (DP,最长反链)

版权声明:希望能在自己成长的道路上帮到更多的人,欢迎各位评论交流 https://blog.csdn.net/yiqzq/article/details/82056664

原题地址:http://poj.org/problem?id=1065

题意:要处理n个长为li,宽为wi的木棍,若处理完(li, wi)后接着处理(li’, wi’)且满足li’ >= li, wi’ >= wi 则不花费时间,否则花费1单位时间,问处理完n根木棍最少花费多长时间。

思路;这题用dp来求解的话涉及到了离散中偏序集的知识,具体内容参考这篇博客

最长反链参考资料:http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/
具体内容看代码:

#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>

#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int t, n;
struct node {
    int x, y;
    bool operator <(const node &a)const {
        if (x == a.x) return y < a.y;
        else return x < a.x;
    }
} e[maxn];
int dp[maxn];
int a[maxn];
int main() {

    scanf("%d", &t);
    while (t--) {

    int len=1;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d%d", &e[i].x, &e[i].y);
        }
        sort(e + 1, e + 1 + n);
        for (int i = 1; i <= n; i++) {
            a[i] = e[n - i + 1].y;
        }
            CLR(dp, 0x3f);
        for (int i = 1; i <= n; i++) {
            *lower_bound(dp , dp  + n, a[i]) = a[i];
        }
        printf("%d\n", lower_bound(dp , dp + n, INF) - dp);
////        dp[1]=a[1];
////        for(int i=2;i<=n;i++){
////            if(dp[len]<a[i]) dp[++len]=a[i];
////            else {
////                int j=lower_bound(dp+1,dp+1+len,a[i])-dp;
////                dp[j]=a[i];
////            }
////        }
////        printf("%d\n",len);
    }
    return 0;
}

附上贪心代码:

#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>

#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl

using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int t, n;
struct node {
    int x, y;
    bool operator <(const node &a)const {
        if (x == a.x) return y < a.y;
        else return x < a.x;
    }
} e[maxn];
int a[maxn];
int vis[maxn];
int main() {
    scanf("%d", &t);
    while (t--) {
        CLR(vis, 0);
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d%d", &e[i].x, &e[i].y);
        }
        sort(e + 1, e + 1 + n);
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            if (vis[i]) continue;
            ans++;
            vis[i] = 1;
            int x = i;
            for (int j = x + 1; j <= n; j++) {
                if (e[j].y >= e[x].y && !vis[j]) {
                    x = j;
                    vis[j] = 1;
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/82056664