上次在hdu做的这题,用的是贪心的方法。今天用dp的方法做了一下这题。顺带把上次的代码一并贴出来。
dp:
#include<stdio.h>
#include<stdlib.h>
struct node
{
int x,y;
}p[5000];
int cmp(const void *a,const void *b)
{
struct node *aa=(node*)a;
struct node *bb=(node*)b;
if(aa->x!=bb->x)
return aa->x-bb->x;
else return aa->y-bb->y;
}
int dp[5000];
int main()
{
//freopen("t.txt","r",stdin);
int T,n,i,k;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
qsort(p,n,sizeof(p[0]),cmp);
dp[0]=1;
for(i=0;i<n;i++)
{
int maxn=1;
for(k=0;k<i;k++)
if(p[i].y<p[k].y&&dp[k]+1>maxn)
{
maxn=dp[k]+1;
}
dp[i]=maxn;
}
int maxn=-1;
for(i=0;i<n;i++)
if(dp[i]>maxn)maxn=dp[i];
printf("%d\n",maxn);
}
return 0;
}
贪心:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int l,w;
}s[5000];
int cmp(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
if(aa->l!=bb->l)
return aa->l-bb->l;
else return aa->w-bb->w;
}
int t[10001];
int main()
{
//freopen("t.txt","r",stdin);
int T,n,i,k,ans;
scanf("%d",&T);
while(T--)
{
memset(t,0,sizeof(t));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&s[i].l,&s[i].w);
qsort(s,n,sizeof(s[0]),cmp);
int maxn=s[0].w;
ans=1;
for(i=1;i<n;i++)
{
if(s[i].w>=maxn)
{
int x=t[maxn];
t[maxn]=0;
maxn=s[i].w;
t[maxn]=x;
}
else
{
int cur=maxn;
for(;;)
if(s[i].w>=t[cur])
{
if(t[cur]==0)
{ans++;t[cur]=s[i].w;break;}
else
{
int x=t[t[cur]],y=t[cur];
t[y]=0;t[s[i].w]=x;t[cur]=s[i].w;//3个顺序很重要,因为涉及到条件的等于
break;
}
}
else cur=t[cur];
}
}
printf("%d\n",ans);
}
return 0;
}