1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2
5
两种解法:
1).若矩形X能被Y覆盖,则在X-->Y 连一条边,那么最多的覆盖数就是将来这个DAG的最长路径。
2).直接按l排序,然后做一遍LIS即可。
/**************************************************** * author:crazy_石头 * Pro:Jobdu * algorithm:矩形覆盖 * Time:32ms * Judge Status:Accepted *******************************************************/ #pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <queue> #include <vector> #include <algorithm> #include <cmath> using namespace std; #define rep(i,h,n) for(int i=(h);i<=(n);i++) #define ms(a,b) memset((a),(b),sizeof(a)) #define eps 1e-8 #define INF 1<<29 #define LL __int64 const int maxn=1000+5; struct R { int l,r; }a[maxn]; int dp[maxn];//dp[i]表示从i开始能覆盖最多的矩形; inline int cmp(R A,R B) { return A.l<B.l; } int main() { int N,n,i,j,p,q; cin>>N; while(N--) { cin>>n; for(i=0;i<n;i++) { cin>>p>>q; if(p>q) { a[i].l=p; a[i].r=q; } else { a[i].l=q; a[i].r=p; } dp[i]=1; } sort(a,a+n,cmp); int maxm=1; for(i=1;i<n;i++) { for(j=i-1;j>=0;j--) { if(a[i].l>a[j].l&&a[i].r>a[j].r&&dp[i]<dp[j]+1) dp[i]=dp[j]+1; } maxm=max(maxm,dp[i]); } cout<<maxm<<endl; } return 0; }