DAG模型

来源:互联网 发布:淘宝饰品店便宜 编辑:程序博客网 时间:2024/06/04 19:49

题目:

       有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 100struct  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;}




原创粉丝点击