luogu1034[矩形覆盖]
2017-10-26 16:51
99 查看
dp[i][k]表示i个点被j个矩形覆盖的最小面积
s[i][j]表示第i个点到第j个点的面积
dp[i][k]=dp[j][k-1]+s[j+1][i]
s[i][j]表示第i个点到第j个点的面积
dp[i][k]=dp[j][k-1]+s[j+1][i]
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 50 + 5 ; int s ; int dp [5] ; struct P { int x , y ; }a ; int cmp ( P l , P r ) { if ( l.x == r.x ) return l.y < r.y ; return l.x < r.x ; } int main (){ int n , K ; scanf ( "%d%d" , &n , &K ) ; for ( int i = 1 ; i <= n ; ++ i ) scanf ( "%d%d" , & a [i].y , & a [i].x ) ; sort ( a + 1 , a + 1 + n , cmp ); for ( int i = 1 ; i <= n ; ++ i ){ int h = a [i].y , l = a [i].y ; for ( int j = i ; j <= n ; ++ j ) { h = max ( h , a [j].y ) ; l = min ( l , a [j].y ) ; s [i] [j] = (h-l)*(a[j].x-a[i].x); } } memset ( dp , 127 , sizeof dp ) ; for ( int i = 1 ; i <= n ; ++ i ){ dp [i] [1] = s [1] [i] ; for ( int k = 2 ; k <= K ; ++ k ) for ( int j = k-1 ; j < i ; ++ j ) dp [i] [k] = min ( dp [i] [k] , dp [j] [k-1] + s [j+1] [i] ); } printf ( "%d" , dp [K] ) ; return 0 ; }
相关文章推荐
- BZOJ 1185 [HNOI2007]最小矩形覆盖
- 【OpenJudge 1793】矩形覆盖
- 剑指offer——矩形覆盖
- 《剑指offer》-矩形覆盖
- 矩形覆盖
- HDU 1255 覆盖的面积 (矩形面积交)
- 矩形覆盖-我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
- 1185: [HNOI2007]最小矩形覆盖
- 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
- Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法
- [九度OnlineJudge][剑指Offer]题目1390:矩形覆盖
- HDU 1255 覆盖的面积(线段树求矩形面积交)
- Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法
- LeetCode-223. Rectangle Area (JAVA)求矩形覆盖面积
- [HDOJ1255] 覆盖的面积(线段树,扫描线,矩形面积交)
- P1034 矩形覆盖
- 递归与循环--斐波那契数列、跳台阶、矩形覆盖
- ZOJ 2747 Paint the Wall(多矩形面积覆盖)
- 矩形覆盖
- hdu 5091 给定矩形覆盖尽量多点 扫描线+线段树