poj 1609 dp(堆积木能达到的最高层)

题意:给出一列数对 ,求出其最长的不减序列的长度。

思路:最简单的思路是采用lis,dp实现,nlogn的复杂度(注意不减和递增的区别,二分查找的条件要进行改变)。网上看到针对此题的另一种思路,直接对数据进行dp:此题的数据范围为1~100,对数据dp的复杂度为O(100*100)。

lis的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define N 10005
struct point{
    int a,b;
}s[N];
int n,dp[N];
int search(int x,int high){
    int low,mid;
    low = 0;
    while(low <= high){
        mid = (low + high)>>1;
        if(dp[mid] <= x)
            low = mid+1;
        else
            high = mid-1;
    }
    return low;
}
int lis(){
    int i,j,len = 0;
    dp[0] = s[0].b;
    for(i = 1;i<n;i++){
        j = search(s[i].b,len);
        dp[j] = s[i].b;
        if(j > len)
            len++;
    }
    return len+1;
}
int cmp(const void *x,const void *y){
    if((*(struct point *)x).a == (*(struct point *)y).a)
        return (*(struct point *)x).b - (*(struct point *)y).b;
    return (*(struct point *)x).a - (*(struct point *)y).a;
}
int main(){
    while(scanf("%d",&n) && n){
        int i;
        memset(s, 0, sizeof(s));
        memset(dp, 0, sizeof(dp));
        for(i = 0;i<n;i++)
            scanf("%d %d",&s[i].a,&s[i].b);
        qsort(s,n,sizeof(struct point),cmp);
        printf("%d\n",lis());
    }
    printf("*\n");
    return 0;
}

数据dp代码:

#include <stdio.h>
#include <string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define N 105
int s[N][N],dp[N][N];
int n;
int main(){
    while(scanf("%d",&n) && n){
        int i,j,a,b;
        memset(s, 0, sizeof(s));
        memset(dp, 0, sizeof(dp));
        for(i = 0;i<n;i++){
            scanf("%d %d",&a,&b);
            s[a][b]++;
        }
        for(i = 1;i<=100;i++)
            for(j = 1;j<=100;j++)
                dp[i][j] = max(dp[i-1][j] ,dp[i][j-1])+s[i][j];
        printf("%d\n",dp[100][100]);
    }
    printf("*\n");
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值