矩形嵌套(DP)
矩形嵌套
時間限制: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),表示矩形的長和寬輸出每組測試數據都輸出一個數,表示最多符合條件的矩形數目,每組輸出占一行樣例輸入1101 22 45 86 107 93 15 812 109 72 2樣例輸出5題解:DAG(有向無環圖)模型題先將矩形的長寬儲存在結構體中,使短的邊放在x,長的邊放在y,然后進從小到大排序但是該排序不能保證后一個矩形不能大于前一個矩形,所以還要進行遍歷判斷。該題的主要是判斷的地方,即當前的矩形是否大于之前比較過的矩形,(比較長寬)?即(s[i].x > s[j].x) && (s[i].y > s[j].y)?如果當前的矩形大于另一個矩形則更新dp[i]的值最后遍歷找出最大的值 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 using namespace std; 6 7 int dp[1100]; 8 struct node{ 9 int x,y; 10 }s[1100]; 11 bool cmp(node a, node b) 12 { 13 if(a.x == b.x) return a.y < b.y; 14 return a.x < b.x; 15 } 16 void init(int n) 17 { 18 for(int i = 0; i <= n; i++) 19 dp[i] = 1; 20 } 21 int main() 22 { 23 int t; 24 int n, a, b; 25 while(scanf("%d",&t) != EOF) 26 { 27 while(t--) { 28 scanf("%d",&n); 29 for(int i = 0; i < n; i++)//存邊 30 { 31 scanf("%d%d",&a,&b); 32 if(a > b) {s[i].x = b, s[i].y = a;} 33 else {s[i].x = a, s[i].y = b;} 34 } 35 init(n); 36 sort(s, s+n, cmp); 37 for(int i = 1; i < n; i++) 38 for(int j = 0; j < i; j++) 39 if( (s[i].x > s[j].x) && (s[i].y > s[j].y) ) 40 { 41 if(dp[i] < (dp[j]+1))//如果當前的矩形大于另一個矩形,更新dp[i]的值 42 dp[i] = dp[j]+1; 43 } 44 int ans = 0; 45 for(int i = 0; i < n; i++)//找出最大的值 46 if(dp[i] > ans) 47 ans = dp[i]; 48 printf("%d\n",ans); 49 } 50 51 } 52 return 0; 53 }?
轉載于:https://www.cnblogs.com/creativepower/p/7324575.html
總結
- 上一篇: 什么是响应式设计?为什么要做响应式设计?
- 下一篇: 2016年CCF第七次测试 俄罗斯方块