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
我们用逆向思维考虑。
用dp[i][j]表示前i本书,留下j本的最小值
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<queue> 6 #include<algorithm> 7 using namespace std; 8 const int MAXN=301; 9 void read(int &n) 10 { 11 char c='+';int x=0;bool flag=0; 12 while(c<'0'||c>'9'){c=getchar();if(c=='-')flag=1;} 13 while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();} 14 flag==1?n=-x:n=x; 15 } 16 int n,k; 17 struct node 18 { 19 int gao,kuan; 20 }book[MAXN]; 21 int comp(const node &a,const node &b) 22 { 23 return a.gao<b.gao; 24 } 25 int dp[MAXN][MAXN]; 26 int presum[MAXN]; 27 int main() 28 { 29 read(n);read(k); 30 k=n-k; 31 for(int i=1;i<=n;i++) 32 { 33 read(book[i].gao); 34 read(book[i].kuan); 35 } 36 sort(book+1,book+n+1,comp); 37 for(int i=2;i<=n;i++) 38 for(int j=2;j<=min(k,i);j++) 39 { 40 dp[i][j]=0x7fffff; 41 for(int k=j-1;k<i;k++) 42 dp[i][j]=min(dp[i][j],dp[k][j-1]+abs(book[i].kuan-book[k].kuan)); 43 } 44 int ans=0x7fffff; 45 for(int i=k;i<=n;i++) 46 ans=min(ans,dp[i][k]); 47 printf("%d",ans); 48 return 0; 49 }
作者:自为风月马前卒
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。