ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

hdu 1421 搬寝室

2022-01-26 16:05:45  阅读:130  来源: 互联网

标签:1421 hdu xhd int 疲劳度 不选 寝室 物品 dp


本题是一道DP

Problem Description
搬寝室是很累的,xhd深有体会.时间追述2006年7月9号,那天xhd迫于无奈要从27号楼搬到3号楼,因为10号要封楼了.看着寝室里的n件物品,xhd开始发呆,因为n是一个小于2000的整数,实在是太多了,于是xhd决定随便搬2_k件过去就行了.但还是会很累,因为2_k也不小是一个不大于n的整数.幸运的是xhd根据多年的搬东西的经验发现每搬一次的疲劳度是和左右手的物品的重量差的平方成正比(这里补充一句,xhd每次搬两件东西,左手一件右手一件).例如xhd左手拿重量为3的物品,右手拿重量为6的物品,则他搬完这次的疲劳度为(6-3)^2 = 9.现在可怜的xhd希望知道搬完这2*k件物品后的最佳状态是怎样的(也就是最低的疲劳度),请告诉他吧.

Input
每组输入数据有两行,第一行有两个数n,k(2<=2*k<=n<2000).第二行有n个整数分别表示n件物品的重量(重量是一个小于2^15的正整数).

Output
对应每组输入数据,输出数据只有一个表示他的最少的疲劳度,每个一行.

 

分析

题意:有n件物品,要搬2k件,要求疲劳度最小

疲劳度就是(a-b)2

a,b就越接近越好,那么ab只能相邻

先要对所有物品的重量进行排序

从最简单的情况考虑:

  • 两个物品选一对,就选这两个物品就好了
  • 3个物品选一对,要么12要么23
  • 4个物品选一对,把情况分成两部分,选4/不选4,如果选4,由于一定要选相邻的物品,所以选34;如果不选4,那么就相当于前三个物品选一对
  • n个物品选一对,把情况分成两部分,选n/不选n...
  • n个物品选两对,选n/不选n...

就需要两个指标(n,k)来保存已经解决的子问题的答案,于是令dp[i][j]表示前i个物品中选j对的最小疲劳度。

则dp[i][j]也可分两种情况考虑,选i/不选i。

  • 选i,必然选i-1,再加上前i-2个物品选j-1个的情况。  dp[i][j]=(a[i]-a[i-1])*(a[i]-a[i-1])+dp[i-2][j-1]
  • 不选i,dp[i][j]=dp[i-1][j]

再求最小疲劳度:就是两种情况疲劳度的最小值,类似于迭代地求最小值

所以最终的状态转移方程:dp[i][j]=min{dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]),dp[i-1][j]}

 

#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
int main(){
    int n,k,i,j,a[2005],dp[2005][1005];
    while(scanf("%d %d",&n,&k)==2){
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]); 
        }
        sort(a+1,a+1+n);
        for (i=0;i<=n;i++)
        {
            for (j=1;j<=k;j++)
            {
                dp[j][i]=INF;
            }
        }
        dp[0][0]=0;
        for (i=2;i<=n;i++)
        {
            for (j=1;j*2<=i;j++)
            {
                dp[j][i]=min(dp[j][i-1],dp[j-1][i-2]+(a[i]-a[i-1])*(a[i]-a[i-1]));
            }
        }
        printf("%d\n",dp[k][n]);
    }
    return 0;
} 

 

标签:1421,hdu,xhd,int,疲劳度,不选,寝室,物品,dp
来源: https://www.cnblogs.com/rongshengx/p/15845684.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有