描述
有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一道有意思的動歸題,然而不安分的我想嘗試用用別的方法做,於是寫了乙個wa的**,感覺上是挺對的,可是細細品味,發現乙個致命的錯誤。
錯誤**如下(c):
//問題**,此寫法有點像貪心,存在後效應性,需要用動態規劃取消後效應性
//從大到小開始查詢,這裡我們選擇的不是尺寸最大的,而是可以包含(巢狀)矩形數最多的
//#include
//#define max(a, b) a > b ? a : b
//#define maxsizen 1001
//int t[maxsizen] = ;
//int ans;
//typedef struct
// rec; //矩形
//rec r[maxsizen];
//////檢索小於a[i]和b[i]的最大矩形對應的t[j]
//void retrieve(int p, int n)
//// }
// }
// ans++;
// if(t[q])
//
//}//
//int main(int argc, const char * argv)
//// else
//
// }
//
// int p = 0;
// for(int i = 1; i <= n; i++)
//
// }
// if(t[i] > t[p])
//
// }
//
// retrieve(p, n);
//
// printf("%d\n", ans);
// }
////
// return 0;
//}
這種方法偏向於貪心演算法,可是我忽略了最重要的問題,貪心演算法不能存在後效應性,而我的寫法卻完美的撞上了這個問題!!!
所以,只有另覓動歸了……
//動歸
#include
#include
#define max(a, b) a > b ? a : b
#define maxsizen 1001
int dp[maxsizen]; //dp[i]當排好序的前i個矩形符合條件的包括第i個時的最大值
int ans;
typedef
struct
rec; //矩形
int main(int argc, const
char * argv)
else
}//按一條邊排序
for (int i = 1; i < n; i++)}}
int flag;
for (int i = 1; i <= n; i++)
}dp[i] += flag;
}for (int i = 1; i <= n; i++)
}printf("%d\n", ans);
}return
0;}
ac**,哦耶+_+!!! nyoj 16 矩形巢狀
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當ab套在 6,2 內,但不能巢狀在 3,4 中。你的任務是選出盡可 能多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀...
NYOJ 16 矩形巢狀
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...
NYOJ16 矩形巢狀
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 1...