在平面上有 n 個點(n <= 50),每個點用一對整數座標表示。例如:當 n=4 時,4個點的座標分別為:p1(1,1),p2(2,2),p3(3,6),p4(0,7),如圖1。
這些點可以用 k 個矩形(1<=k<=4)全部覆蓋,矩形的邊平行於座標軸。當 k=2 時,可用如圖2的兩個矩形 sl,s2 覆蓋,s1,s2 面積和為 4。問題是當 n 個點座標和 k 給出後,怎樣才能使得覆蓋所有點的 k 個矩形的面積之和為最小呢。約定:覆蓋乙個點的矩形面積為 0;覆蓋平行於座標軸直線上點的矩形面積也為0。各個矩形必須完全分開(邊線與頂點也都不能重合)。
有若干組測試資料。每組的第1行有兩個整數n、k,分別表示平面點數和需用來覆蓋這些點的矩形數。接下來有n行,每行有兩個整數xi、yi,表示點的座標(xi, yi),(0<=xi, yi<=500)。兩組資料之間空乙個空行。
對每組測試資料,輸出滿足條件的最小的矩形面積之和。
4 21 12 23 60 74
思路:區間dp題,感覺還是蠻難的,dp[i][j][k]表示從第i個到第j個用了k個矩形覆蓋所需要的最小面積,和能量項鍊有些相似。對k=1進行預處理,對k從2從小到大遍歷每乙個區間,再遍歷區間內的每乙個點。對每乙個點來說,遍歷每一種覆蓋方法(例如k=4時,對某乙個點有(1,3),(2,2),(3,1)幾種覆蓋方法)要麼和左邊的進行覆蓋,要麼和右邊的進行覆蓋,取兩者中的最小值就是該點的最小覆蓋面積。
#include#include#include#define inf 0x3f3f3f3f
using namespace std;
int dp[100][100][5];
//dp[i][j][k]: 覆蓋i到j用k個矩形的最小面積
struct node
sort(a,a+n) //對所有點按橫座標進行排序,便於dp;
memset(dp,0,sizeof(dp));
//for(int i=0;i=0;i--)}}
}}
cout<
return 0;
}
NOIP 2002 矩形覆蓋
題目描述 在平面上有 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 覆蓋,...
noip 2002 矩形覆蓋
在平面上有 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...
noip2002矩陣覆蓋(搜尋)
矩陣覆蓋 在平面上有 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 覆蓋,...