nyoj16 矩形巢狀dp
阿新 • • 發佈:2018-12-09
具有最優子結構性質,按照從小到大排序。 用dp[]表示當前最大巢狀數,初始值為1。 用二次迴圈尋找當前最大巢狀數。
#include <iostream> #include <algorithm> #include <cstring> #define maxn 1001 using namespace std; struct rect{ int x,y; }k[maxn]; bool cmp(rect a,rect b){ if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int dp[maxn]; int main(){ int test_num; cin>>test_num; while(test_num--){ memset(dp,0,sizeof(dp)); int rect_num; cin>>rect_num; for(int i=0;i<rect_num;i++){ cin>>k[i].x>>k[i].y; if(k[i].x>k[i].y) swap(k[i].x,k[i].y); } sort(k,k+rect_num,cmp); int max_num=0; for(int i=0;i<rect_num;i++){ dp[i]=1; for(int j=0;j<i;j++){ if(k[i].x>k[j].x&&k[i].y>k[j].y&&dp[j]+1>dp[i]){ dp[i]=dp[j]+1; } } } for(int i=0;i<rect_num;i++) max_num=max(max_num,dp[i]); cout<<max_num<<endl; } }