P1034 矩形覆蓋

2022-05-13 12:45:08 字數 1858 閱讀 6266

在平面上有 n 個點(n <= 50),每個點用一對整數座標表示。例如:當 n=4 時,4個點的座標分另為:p1(1,1),p2(2,2),p3(3,6),p4(0,7),見圖一。

這些點可以用 k 個矩形(1<=k<=4)全部覆蓋,矩形的邊平行於座標軸。當 k=2 時,可用如圖二的兩個矩形 sl,s2 覆蓋,s1,s2 面積和為 4。問題是當 n 個點座標和 k 給出後,怎樣才能使得覆蓋所有點的 k 個矩形的面積之和為最小呢。約定:覆蓋乙個點的矩形面積為 0;覆蓋平行於座標軸直線上點的矩形面積也為0。各個矩形必須完全分開(邊線與頂點也都不能重合)。

輸入格式:

n k xl y1 x2 y2 ... ...

xn yn (0<=xi,yi<=500)

輸出格式:

輸出至螢幕。格式為:

乙個整數,即滿足條件的最小的矩形面積之和。

輸入樣例#1:

4 2

1 12 2

3 60 7

輸出樣例#1:

4

用dp[i][j][k]表示,用k個矩形,覆蓋i到j號點,所需要的最小面積

1 #include2 #include3 #include4 #include5 #include6 #include7

#define lli long long int

8using

namespace

std;

9const

int maxn=233;10

void read(int &n)

1115

while(c>='

0'&&c<='9'

)16

17 flag==1?n=-x:n=x;18}

19int

n,k;

20struct

node

21point[maxn];

24int dp[maxn][maxn][10

];25

int comp(const node &a,const node &b)

2632

intmain()

3342 memset(dp,0x3f,sizeof

(dp));

43 sort(point+1,point+n+1

,comp);

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

4554}55

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

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

57for(int k=i+1;k)

58 dp[i][j][2]=min(dp[i][j][2],dp[i][k][1]+dp[k+1][j][1

]);59

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

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

62for(int k=i+1;k)

6367

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

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

69for(int k=i+1;k)

7075

if(dp[1][n][k]==2134

)76 dp[1][n][k]=2106

;77 printf("

%d",dp[1

][n][k]);

78return0;

79 }

P1034 矩形覆蓋

在平面上有nn個點 n le 50n 50 每個點用一對整數座標表示。例如 當 n 4n 4 時,44個點的座標分另為 p 1p1 1,11,1 p 2p2 2,22,2 p 3p3 3,63,6 p 4p4 0,70,7 見圖一。這些點可以用kk個矩形 1 le k le 41 k 4 全部覆蓋,...

題解 P1034 矩形覆蓋

在平面上有n個點 n 50 每個點用一對整數座標表示。例如 當n 4時,4個點的座標分另為 p1 1,1 p2 2,2 p3 3,6 p4 0,7 見圖一。這些點可以用k個矩形 1 k 4 全部覆蓋,矩形的邊平行於座標軸。當k 2時,可用如圖二的兩個矩形s1,s2覆蓋,81,s2面積和為4。問題是當...

洛谷P1034矩形覆蓋

據說是dp,所以我用dfs,居然a了,資料真水 說說思路,我們要求覆蓋所有點且不能重疊,顯然我們要從點入手,我們可以列舉每個點被哪個矩形重疊,因為如果列舉矩形覆蓋點的話,貌似不可做,具體怎麼實現呢?最好小夥伴們手動畫個圖,一下就明白了,列舉每個點被哪個矩形覆蓋,那麼必然是要根據點的座標來調整矩形的位...