在平面上有 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:1 12 2
3 60 7
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了,資料真水 說說思路,我們要求覆蓋所有點且不能重疊,顯然我們要從點入手,我們可以列舉每個點被哪個矩形重疊,因為如果列舉矩形覆蓋點的話,貌似不可做,具體怎麼實現呢?最好小夥伴們手動畫個圖,一下就明白了,列舉每個點被哪個矩形覆蓋,那麼必然是要根據點的座標來調整矩形的位...