状态: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; }
