洛谷 P1233 木棍加工 贪心+最长上升子序列+dilworth定理

洛谷 P1233 木棍加工 贪心+最长上升子序列+dilworth定理

题解:

(1)我们先对木棍按照长度或者宽度从大到小排序
(2)假设我们按长度进行排序,那么我们就在宽度序列中求最长上升子序列的长度即可。

为什么最长上升子序列的长度就是答案呢?
因为题目中要求我们求的是在宽度序列中最长不上升子序列的个数,根据dilworth定理,最长不上升子序列的个数=最长上升子序列的长度
可以自己动手模拟一下就知道为啥两者相等了

代码如下:

#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 5005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

struct node{
    int l;//长度
    int w;//宽度
    bool operator < (const node &a) const{
        return l>a.l;
    }
}a[MAX];


int n,d[MAX];

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&a[i].l,&a[i].w);
    }
    sort(a,a+n);
    int len=1;
    d[1]=a[0].w;
    for(int i=1;i<n;i++){
        if(d[len]<a[i].w){
            d[++len]=a[i].w;
        }else{
            int p=lower_bound(d+1,d+1+len,a[i].w)-d;;
            d[p]=a[i].w;
        }
    }
    printf("%d",len);
    return 0;
}

你可能感兴趣的:(从零开始的动态规划qwq)