题目:
有N个矩形,每个矩形可以用两个整数a,b描述,表示它的长和宽。矩形X(a,b)可以嵌套在矩形Y(a,b)中当且仅当a<c,b<d,或b<c,a<d(相当于把矩形旋转九十度)
找出能够嵌套在一个里的最多数是多少?
这是DP的一种类型,与图,搜索也有些关系。
方法:1、用贪心算法,先是排序,这要的时间O(n*n)
2、用DP,先排序,在搜的时候记录深度,一但找到已经计算过该点就直接返回值。 O(n*n)
下面是DP的一点代码,自己试着写的,不知道算不算,
#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctype.h>
#include<vector>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<string>
#include<map>
#include<stack>
using namespace std;
#define N 100
struct my
{
int w,l;
int d;
}
go[N];
int num;
int n;
bool cmp(my a,my b)
{
if (a.l!=b.l)
return a.l<b.l;
return a.w<b.w;
}
int dp(int k)
{
num++;
int i,j;
if (go[k].d)
return go[k].d;
i=k+1;
j=0;
int w=go[k].w;
for (;i<n;i++)
{
if (w<go[i].w)
j=max(1+dp(i),j);
}
go[k].d=j;
if (go[k].d==0)
go[k].d=1;
return go[k].d;
}
int main()
{
freopen("fuck.txt","r",stdin);
int i,j,k;
while (cin>>n,n)
{
for (i=0;i<n;i++)
{
cin>>go[i].l>>go[i].w;
if (go[i].l>go[i].w)
swap(go[i].l,go[i].w);
go[i].d=0;
}
sort(go,go+n,cmp);
num=0;
for (i=0;i<n;i++)
{
cout<<go[i].l<<' '<<go[i].w<<endl;
go[i].d=dp(i);
}
k=0;
for (i=0;i<n;i++)
k=max(k,go[i].d),cout<<go[i].d<<' ';
cout<<endl;
cout<<k<<endl;
cout<<"times: "<<num<<endl;
}
return 0;
}