1. 程式人生 > >動態規劃 洛谷P1103 書本整理

動態規劃 洛谷P1103 書本整理

strong 一行 scanf ron 整潔 sca 重復 string mes

P1103 書本整理

題目描述

Frank是一個非常喜愛整潔的人。他有一大堆書和一個書架,想要把書放在書架上。書架可以放下所有的書,所以Frank首先將書按高度順序排列在書架上。但是Frank發現,由於很多書的寬度不同,所以書看起來還是非常不整齊。於是他決定從中拿掉k本書,使得書架可以看起來整齊一點。

書架的不整齊度是這樣定義的:每兩本書寬度的差的絕對值的和。例如有4本書:

1x2 5x3 2x4 3x1 那麽Frank將其排列整齊後是:

1x2 2x4 3x1 5x3 不整齊度就是2+3+2=7

已知每本書的高度都不一樣,請你求出去掉k本書後的最小的不整齊度。

輸入輸出格式

輸入格式:

第一行兩個數字n和k,代表書有幾本,從中去掉幾本。(1<=n<=100, 1<=k<n)

下面的n行,每行兩個數字表示一本書的高度和寬度,均小於200。

保證高度不重復

輸出格式:

一行一個整數,表示書架的最小不整齊度。

輸入輸出樣例

輸入樣例#1:
4 1
1 2
2 4
3 1
5 3
輸出樣例#1:
3

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 using namespace std;
 7 struct
data{ 8 int w,h; 9 }book[120]; 10 bool cmp(const data&a,const data&b){ 11 return a.h<b.h; 12 } 13 int f[120][120]; 14 int n,k,ans; 15 int main(){ 16 scanf("%d%d",&n,&k); 17 for(int i=1;i<=n;i++) scanf("%d%d",&book[i].h,&book[i].w); 18 k=n-k; 19 sort(book+1
,book+n+1,cmp); 20 for(int i=1;i<=n;i++) 21 for(int j=2;j<=min(i,k);j++){ 22 f[i][j]=0x3f3f3f3f; 23 for(int p=j-1;p<i;p++) f[i][j]=min(f[i][j],f[p][j-1]+abs(book[i].w-book[p].w)); 24 } 25 ans=0x3f3f3f3f; 26 for(int i=k;i<=n;i++) ans=min(ans,f[i][k]); 27 printf("%d",ans); 28 return 0; 29 }

動態規劃 洛谷P1103 書本整理