nyoj16矩形嵌套(第一道dp关于dag的题目)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16
题意:有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
思路:先对长和宽来此排序,再按照要求构图,完成之后,直接记忆化搜索,值得注意的地方是你不能只从第一个点搜索,而是要从每个点搜索.......我自己想的时候想到这个了,编写的时候忘了,wa一次..........
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define maxx 10000000 struct node { int x,y; }s[1100]; int vist[1100][1100],n,dp[1100]; int cmp(const node a,const node b) { if(a.x<b.x) return 1; else if(a.x==b.x&&a.y<b.y) return 1; else return 0; } int dfs(int num) { if(dp[num]>0) return dp[num]; dp[num]=1; for(int i=1;i<=n;i++) { if(vist[num][i]) { int tmp=dfs(i)+1; if(dp[num]<tmp) dp[num]=tmp; } } return dp[num]; } int main() { int text; scanf("%d",&text); while(text--) { scanf("%d",&n); memset(vist,0,sizeof(vist)); memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { int x,y; scanf("%d%d",&x,&y); s[i].x=x; s[i].y=y; } sort(s+1,s+1+n,cmp); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if((s[i].x<s[j].x&&s[i].y<s[j].y)||(s[i].x<s[j].y&&s[i].y<s[j].x)) { vist[i][j]=1; } } int maxn=0; for(int i=1;i<=n;i++) { int tmp1=dfs(i); if(tmp1>maxn) maxn=tmp1; } printf("%d\n",maxn); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。