1、http://acm.hdu.edu.cn/showproblem.php?pid=1677
2、題目大意:
有n個盒子,知道寬和高,如果第一個盒子的寬和高是w1,h1,第二個的寬和高是w2,h2,如果w1<w2 && h1<h2 ,那麼第二個盒子就能裝下第一個盒子,求最終剩下多少個盒子
3、思路分析:
這道題目和裝娃娃的題目有點像,首先得排序,這個很關鍵,按照w從大到小排序,再按照h從小到大排序,一開始還以爲只要都按照從大到小就可以,但是對於w相同的盒子此排序就不對了,排序後對h做最長上升子序列,輸出的最大長度即可
4、題目:
Nested Dolls
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2275 Accepted Submission(s): 653
5、Ac代碼:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 20005
struct node
{
int h;
int w;
}a[N];
int dp[N];
int stack[N];
int cmp(node a,node b)
{
if(a.w==b.w)
return a.h<b.h;
return a.w>b.w;
}
int lis(int n)
{
memset(dp,0,sizeof(dp));
memset(stack,0,sizeof(stack));
int top=0;
stack[top]=-99999999;
int maxx=-1;
for(int i=1; i<=n; i++)
{
if(a[i].h>=stack[top])
{
stack[++top]=a[i].h;
dp[i]=top;
}
else
{
int l=1,r=top;
while(l<=r)
{
int mid=(l+r)>>1;
if(a[i].h>=stack[mid])
{
l=mid+1;
}
else
r=mid-1;
}
stack[l]=a[i].h;
dp[i]=l;
}
if(dp[i]>maxx)
maxx=dp[i];
}
return maxx;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%d%d",&a[i].w,&a[i].h);
}
sort(a+1,a+n+1,cmp);
int ans=lis(n);
printf("%d\n",ans);
}
return 0;
}