基礎演算法 巢狀矩形

2021-07-14 13:28:20 字數 1202 閱讀 6745

時間限制: 1 sec  

記憶體限制: 128 mb

有n個矩形,每個矩形可以用兩個整數a,b描述,表示它的長和寬。矩形x(a, b)可以巢狀在矩形y(c,d)中當且僅當a你的任務是選出盡量多的矩形排成一行,使得除了最後乙個外,每乙個矩形都可以巢狀在下乙個矩形內。

第1行:1個整數n(1<=n<=1000)

第2..n+1行:每行2個整數,分別表示矩形的兩個邊長。每個矩形依次編號為1~n。

第1行:1個整數k,表示巢狀的最大層數。

第2行:k個整數,表示依次巢狀的矩形的編號。若有多組解,輸出字典序最小的一組解。

8

14 9

15 19

18 12

9 10

19 17

15 9

2 13

13 10

4

4 8 3 2

本可按長排序後,以寬作乙個最長上公升子串行問題,但由於長寬可互換問題,博主的做法是將矩形長寬交換複製乙份後再做,**如下。
#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f

#define ll long long int

ll getint()

return ans*f;

}using namespace std;

struct square

square(int a,int b,int c)

square rev()

bool operator<(const square &rhs)const

}s[2016];

int ans[2016],fa[2016],an=1;

void p(int d)

}int main()

sort(s+1,s+2*n+1);

for(i=1;i<=2*n;++i)

for(j=1;js[i].x&&s[j].y>s[i].y&&ans[j]+1>=ans[i])

printf("%d\n",ans[an]);

for(i=an;fa[i];i=fa[i])

printf("%d ",s[i].k);

printf("%d\n",s[i].k);

}

基礎演算法 巢狀矩形

有n個矩形,每個矩形可以用兩個整數a,b描述,表示它的長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a你的任務是選出盡量多的矩形排成一行,使得除了最後乙個外,每乙個矩形都可以巢狀在下乙個矩形內。第1行 1個整數n 1 n 1000 第2.n 1行 每行2個整數,分別表示矩形的兩個邊長。...

矩形巢狀 DP

原先沒看出來,後來發現和議題很像,都是胴體規劃,那題是給你一些點的座標,找到最多的點連成的顯示單調的 include includestruct asd ju 1010 int cmp const void a,const void b int qian int j,int i void sol i...

矩形巢狀 DAG LIS

矩形巢狀 描述有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a如果矩形x可以巢狀在矩形y裡,我們就從x到y連一條有向邊,最後會形成乙個dag。include include include using namespace std const ...