NYOJ 16 矩形巢狀(動態規劃 or 貪心)

2021-08-04 04:04:28 字數 1150 閱讀 7424

題目意思很清晰  求最多的巢狀個數  相等不能被巢狀

本文提供兩種解法 

第一種解法對於 矩形邊長較小時效果比較好 但是如果矩形邊長特別大則不能有效求解

第一種解法是dp做的  

定義dp[i][j] 為邊長為i和j的矩形 最多能巢狀多少個矩形 

狀態轉移過程是這樣來的  當前狀態是由比當前矩形的寬小一 或者比當前矩形的長小一的兩種狀態的較大者來的 

如果給定的這些矩形中存在乙個比當前矩形長寬都小一的矩形  那麼 dp[i][j] = max(dp[i][j] , dp[i - 1][j - 1] + 1);

儲存這些矩形資訊的方式是鄰接表  有點桶排序的意思 嗯 就是這樣

#include #include #include using namespace std;

const int n = 104;

int arr[n][n], dp[n][n];

int main()

int maxx = 0;

for(int i = 1; i < n; i ++)

}cout << dp[n - 1][n - 1] << endl;

}}/*

41 1

1 22 1

3 2*/

當然還有顯而易見的方法二 就是貪心了  

首先我們按照矩形的長為第一順序  寬為第二順序 來排序 然後找出每個矩形能巢狀多少矩形 在找出最大的內個值就行了

#include #include #include using namespace std;

struct node

rectangle[1005];

bool cmp(const node &a, const node &b)

bool judge(const node &a, const node &b)

int main()

sort(rectangle , rectangle + n, cmp);

int ans = 0;

for (int i = 0; i < n; i ++)

}ans = max(ans , dp[i]);

}cout << ans << endl;

}}

NYOJ 16 矩形巢狀(動態規劃)

矩形巢狀 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a參考最長上公升子串行長度 狀態轉移方程dp i max dp i dp j 1 include include ...

NYOJ 16 矩形巢狀(動態規劃)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...

NYOJ 16 矩形巢狀(動態規劃)

矩形巢狀 時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入第一行是乙個正正數n 0 每組測試資料的第一行是乙個正正數n,表示該組測試資料中含有矩形的個數 n 1000...