描述

n个人选出3*m人,排成m组,每组3人。

站的队形——较矮的2个人站两侧,最高的站中间。

从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低。

计算公式为 h=(a-b)^2 (a、b为较矮的2人的身高)
那么问题来了。

现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低。

显然是一道动态规划题目。(如果要求最大的残疾程度最小,可以二分解决)

一道经典的线性动态规划问题,其中也利用了一个贪心的思想。
核心:相邻最优+倒序处理
设f[I,j]为前i个人分成j 组的最小值,其中这里的前i个人为高度前i高的人,与题目的前i个人有所不同。
那么我们有这样的状态转移方程:
F[I,j]=Min{f[i-1][j], f[i-2][j-1]+(a[i]-a[i-1])^2}
说明一下:
1.这里的f[i-1][j]表示不以较矮身份分i号人到组中
2.f[i-2][j-1]表示以a[i], a[i-1]为两个较矮的人分成一组(即当前此人和后面的一个人一组)
显然,在排好序后,取a,b时取相邻的总比取不相邻的要好。
这样我们就可通过计算公式求出“残疾程度”,那么就可以了。
而f[i-3,j-1]即默认了a[i-2], a[i-1]与a[i]形成一组,实际上残疾程度的计算与最高的人没有任何关系
所以是f[i-2,j-1]!
最关键的需要注意DP的方向。。
由于题目升序排序。。故而当前第i人是最高的。。这样会发生一个很悲剧的情况:
很有可能最后的几个二元组找不到补齐的第三人。。所以我们需要把数据倒过来处理。。
即i循环来倒推
这样就算最后几个人组成若干二元组。。由于n>=3*m成立所以必然可以找到对应的第三人。。
(这段话好好理解,对dp有很大帮助)
在有了a,b后,中间的那个人c,需要c>a,c>b,所以c的下标必在a,b前面,又因为a和b相邻
因此循环的时候要有j<=min(m,(n-i+1)/3)。
最后答案就是f[1][m]
嗯表示还是要好好多明白题目意思扩展思路
涨姿势了Orz
我写的代码是从后往前倒序的,所以状态转移方程有所不同
好好体会吧~

附上AC代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
template<class T> inline void read(T &_a){bool f=0;int _ch=getchar();_a=0;while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();}while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();}if(f)_a=-_a;
}long long n,m,h[5001],dp[5001][1001];int main()
{read(m); read(n);for (register int i=n;i;--i) read(h[i]);memset(dp,0x7f,sizeof(dp));for (register int i=1;i<=n;++i) dp[i][0]=0;for (register int i=1;i<=n;++i)for (register int v=1;v*3<=i&&v<=m;++v)dp[i][v]=min(dp[i-1][v],dp[i-2][v-1]+(h[i]-h[i-1])*(h[i]-h[i-1]));printf("%lld",dp[n][m]);return 0;
}

转载于:https://www.cnblogs.com/jaywang/p/7768643.html

迎春舞会之三人组舞 vijos1061 动态规划相关推荐

  1. 【洛谷P1538】迎春舞会之数字舞蹈

    迎春舞会之数字舞蹈 题目链接 一道奇怪的模拟题, 先将样例输出复制下来,观察观察 -- -- -- -- -- -- -- -- ①| | | | | | | | | | | | | | ②| | | ...

  2. Vijos P1062 迎春舞会之交谊舞

    迎春舞会之交谊舞 明显--交谊舞是2个人跳的,而且一男一女   由于交谊舞之前的节目安排,所有的表演者都站成了一排.这一排人的顺序满足2点:     ①对于一对舞伴男生站在女生的左边.     ②任何 ...

  3. vijos p1063(迎春舞会之集体舞)

    DP,从左到右,从上到下 for 一遍,如果j为 跟盖房子有点像,我只算了向下的三角,有人说要算向上的三角,但是还是A了...... 不知道什么原因. 1 program p1063; uses ma ...

  4. 迎春舞会之数字舞蹈(洛谷-P1538)

    题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出--"数字舞蹈".顾名思义就是所有人一起排成若干个数字 - ...

  5. luogu1538:迎春舞会之数字之舞

    题目连接:该题是luogu试炼场的2-3:T1 有一道类似的,难度要高一点的:luogu1498:南蛮图腾 题目大意: 1 给出一个数字n,第二行有若干是数字: 2 要求按照 n 的尺寸来放大这若干个 ...

  6. 常用技巧 —— 打表规律

    [概述] 找规律是一种常见的题型,当给出相关数据后,我们往往可以利用打表的方法,得到大量的数据,然后再寻找规律. 简单来说,打表就是需要对某个范围内的数据进行判断,判断它是否符合某种条件,然后在接下来 ...

  7. 2019luogu试炼场题解包:普及组(更新至2-17)

    1 2.1 简单模拟 6   题号 题目 相对难度1-5 备注 1003 铺地毯 2 逆向查找 1067 多项式输出 3 分段模拟 1540 机器翻译 4 循环队列 1056 排座椅 3 统计排序 1 ...

  8. 【c++算法刷题笔记】——洛谷2

    1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...

  9. linux下模糊搜索命令,linux命令当前文件夹下面模糊搜索文件

    权限管理AppOpsManager AppOps工具类 import android.annotation.TargetApi; import android.app.AppOpsManager; i ...

最新文章

  1. vue笔记整理与总结
  2. java kafka 设置分区_Java kafka如何实现自定义分区类和拦截器
  3. 【翻译】asp.net core中使用MediatR
  4. 解决ios8下coreData没有NSPersistentContainer的问题
  5. 一个手机只能连接一个热点吗_两个手机怎么连接热点
  6. 【xpath】多个xpath Element对象,提取结果是一样的
  7. nupkg 本地安装_关于Visual Studio:如何在本地安装NuGet包.nupkg文件?
  8. c++11总结21——atomic_flag
  9. Elasticsearch:Elasticsearch 开发入门 - Golang
  10. html5 模仿语音聊天气泡,HTML5实现对话气泡动画方法
  11. 校园网环境下的微信同步
  12. 深入浅出LSTM学习
  13. (SQL语句)查询条件模糊匹配若干字段
  14. 读书笔记17 《靠谱》大石哲之
  15. 计算机网络自顶向下第一章知识点总结(上)
  16. 2021年,我的年终总结
  17. 浅谈自然辩证在现代科学领域的作用
  18. Adobe photoshop工具箱工具名称中英文对照
  19. Jetty修改默认端口
  20. PMP证书含金量高在哪里?

热门文章

  1. 点击MSFlexGrid数据控件的标题进行数据排序
  2. 网络中的那些事儿(五)之校园网规划综述
  3. 百度宣布AI同传最新突破!能预测,低延时,演示效果惊人,外媒称媲美人类翻译...
  4. MIT新研究:基于基本运动能力让机器人自主学习,感知世界
  5. Mac系统下安装webpack,cnpm,vue-cli
  6. 重新编译hadoop-2.7.2-src的native以支持Snappy解压压缩库
  7. 怎样实现MathType在Numbers中的运用
  8. SQL查询集合合并成字符串
  9. switch case 解决字符串选择的问题
  10. ahjesus 获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome