您的位置:首页 > 其它

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

2015-01-28 21:29 162 查看
题意:给出一列数对 ,求出其最长的不减序列的长度。

思路:最简单的思路是采用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
;
int n,dp
;
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

,dp

;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: