矩形嵌套(经典dp)

xiaoxiao2021-02-28  98

矩形嵌套

时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。 输入 第一行是一个正正数N(0<N<10),表示测试数据组数, 每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000) 随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽 输出 每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行 样例输入 1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2 样例输出 5

状态:d(i)定义为从i矩形出发能嵌套的最大数。

状态转移方程:d(i)=max{d(j)+1} G[i][j]=1

AC源码:

#include <iostream> #include <cstring> using namespace std; const int maxn=1000+10; struct node { int a,b; }A[maxn]; int T,n; int G[maxn][maxn]; bool chk(int i,int j) { if((A[i].a<A[j].a&&A[i].b<A[j].b)||(A[i].a<A[j].b&&A[i].b<A[j].a)) return true; else return false; } int d[maxn]; int dp(int i) { int& ans=d[i]; if(ans>0) return ans; ans=1; for(int j=1;j<=n;++j) if(G[i][j]) ans=max(ans,dp(j)+1); return ans; } int main() { cin>>T; while(T--) { cin>>n; memset(G,0,sizeof(G)); memset(d,-1,sizeof(d)); for(int i=1;i<=n;++i) cin>>A[i].a>>A[i].b; for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) G[i][j]=chk(i,j); int ans=-1; for(int i=1;i<=n;++i) ans=max(ans,dp(i)); cout<<ans<<endl; } return 0; }

转载请注明原文地址: https://www.6miu.com/read-96686.html

最新回复(0)