zoukankan      html  css  js  c++  java
  • 20180610模拟赛T3——书本整理

    【问题描述】

    小明的书架上放了许多书,为了使书架变得整洁,小明决定整理书架,他将所有书按高度大小排列,这样排了之后虽然整齐了许多,但小明发现,书本的宽度不同,导致书架看上去还是有些凌乱。小明把这个凌乱值定义为相邻两本书的宽度差的绝对值的和。

    例如有4本书:

    1×2
    5×3
    2×4
    3×1

    那么小明将其排列整齐后的顺序是:

    1×2
    2×4
    3×1
    5×3

    凌乱值就是2+3+2=7

    于是小明决定拿掉其中的k本书,使凌乱值最小,你能帮他求出这个最小值吗?已知每本书的高度都不一样。

    【问题输入】

    第一行两个数字n和k,代表书总共有n本,要求从中去掉k本。((lle n le 100, 1le k le n))。下面的n行,每行两个数字表示一本书的高度和宽度,它们均小于200。

    【问题输出】

    一行一个整数,表示书架的最小凌乱值。

    【样例输入】

    4 1
    1 2
    2 4
    3 1
    5 3

    【样例输出】

    3

    【数据范围】

    30%的数据,n≤20。

    100%的数据,n≤l00,k<n。

    题解

    JYT:这是一道简单的动态规划题……

    记录去掉(k)本比较麻烦,那就记录留下(n-k)本吧……

    (dp[i][j])表示到第(i)本且必须保留(i),保留了(j)本的方案数。

    容易得到转移方程:

    (dp[i][kk+1] = min(dp[i][kk+1], dp[j][kk] + abs(book[i].kuan - book[j].kuan)))

    book[i].kuan表示第(i)本书的宽度。

    代码如下:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    
    using namespace std;
    
    #define fill(a) memset(a, 0x3f, sizeof(a))
    
    const int maxn = 105;
    
    int dp[maxn][maxn];
    
    struct BOOK
    {
    	int quan, h, kuan;
    
    	inline bool operator < (const BOOK& other) const
    	{
    		return h < other.h;
    	}
    } book[maxn];
    
    const int inf = 0x3f3f3f3f;
    
    int main()
    {
    	freopen("book.in", "r", stdin);
    	freopen("book.out", "w", stdout);
    	int n, k;
    	scanf("%d%d", &n, &k);
    	for(int i = 1; i <= n; ++i)
    		scanf("%d%d", &book[i].h, &book[i].kuan);
    	k = n-k;
    	sort(book+1, book+1+n);
    	fill(dp);
    	for(int i = 1; i <= n; ++i)
    		dp[i][1] = 0;
    	for(int i = 2; i <= n; ++i)
    		for(int j = 1; j < i; ++j)
    			for(int kk = 1; kk < k; ++kk)
    				dp[i][kk+1] = min(dp[i][kk+1], dp[j][kk] + abs(book[i].kuan - book[j].kuan));
    	int ans = inf;
    	for(int i = 1; i <= n; ++i)
    		ans = min(ans, dp[i][k]);
    	printf("%d", ans);
    	return 0;
    }
    
  • 相关阅读:
    android应用框架搭建------BaseActivity
    Android中Application类用法
    Android App框架设计之编写基类BaseActivity
    android Application类的详细介绍
    Linux使用jstat命令查看jvm的GC情况
    cocos2dx怎样设置ios和Android横屏竖屏的几种方法
    网络请求 http get post 一
    Java多线程中wait, notify and notifyAll的使用
    一个人生活,怎样摆脱孤独提升幸福感?
    js控制文本框仅仅能输入中文、英文、数字与指定特殊符号
  • 原文地址:https://www.cnblogs.com/pfypfy/p/9164005.html
Copyright © 2011-2022 走看看