迎春舞会之三人组舞 vijos1061 动态规划
描述
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 动态规划相关推荐
- 【洛谷P1538】迎春舞会之数字舞蹈
迎春舞会之数字舞蹈 题目链接 一道奇怪的模拟题, 先将样例输出复制下来,观察观察 -- -- -- -- -- -- -- -- ①| | | | | | | | | | | | | | ②| | | ...
- Vijos P1062 迎春舞会之交谊舞
迎春舞会之交谊舞 明显--交谊舞是2个人跳的,而且一男一女 由于交谊舞之前的节目安排,所有的表演者都站成了一排.这一排人的顺序满足2点: ①对于一对舞伴男生站在女生的左边. ②任何 ...
- vijos p1063(迎春舞会之集体舞)
DP,从左到右,从上到下 for 一遍,如果j为 跟盖房子有点像,我只算了向下的三角,有人说要算向上的三角,但是还是A了...... 不知道什么原因. 1 program p1063; uses ma ...
- 迎春舞会之数字舞蹈(洛谷-P1538)
题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出--"数字舞蹈".顾名思义就是所有人一起排成若干个数字 - ...
- luogu1538:迎春舞会之数字之舞
题目连接:该题是luogu试炼场的2-3:T1 有一道类似的,难度要高一点的:luogu1498:南蛮图腾 题目大意: 1 给出一个数字n,第二行有若干是数字: 2 要求按照 n 的尺寸来放大这若干个 ...
- 常用技巧 —— 打表规律
[概述] 找规律是一种常见的题型,当给出相关数据后,我们往往可以利用打表的方法,得到大量的数据,然后再寻找规律. 简单来说,打表就是需要对某个范围内的数据进行判断,判断它是否符合某种条件,然后在接下来 ...
- 2019luogu试炼场题解包:普及组(更新至2-17)
1 2.1 简单模拟 6 题号 题目 相对难度1-5 备注 1003 铺地毯 2 逆向查找 1067 多项式输出 3 分段模拟 1540 机器翻译 4 循环队列 1056 排座椅 3 统计排序 1 ...
- 【c++算法刷题笔记】——洛谷2
1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...
- linux下模糊搜索命令,linux命令当前文件夹下面模糊搜索文件
权限管理AppOpsManager AppOps工具类 import android.annotation.TargetApi; import android.app.AppOpsManager; i ...
最新文章
- vue笔记整理与总结
- java kafka 设置分区_Java kafka如何实现自定义分区类和拦截器
- 【翻译】asp.net core中使用MediatR
- 解决ios8下coreData没有NSPersistentContainer的问题
- 一个手机只能连接一个热点吗_两个手机怎么连接热点
- 【xpath】多个xpath Element对象,提取结果是一样的
- nupkg 本地安装_关于Visual Studio:如何在本地安装NuGet包.nupkg文件?
- c++11总结21——atomic_flag
- Elasticsearch:Elasticsearch 开发入门 - Golang
- html5 模仿语音聊天气泡,HTML5实现对话气泡动画方法
- 校园网环境下的微信同步
- 深入浅出LSTM学习
- (SQL语句)查询条件模糊匹配若干字段
- 读书笔记17 《靠谱》大石哲之
- 计算机网络自顶向下第一章知识点总结(上)
- 2021年,我的年终总结
- 浅谈自然辩证在现代科学领域的作用
- Adobe photoshop工具箱工具名称中英文对照
- Jetty修改默认端口
- PMP证书含金量高在哪里?
热门文章
- 点击MSFlexGrid数据控件的标题进行数据排序
- 网络中的那些事儿(五)之校园网规划综述
- 百度宣布AI同传最新突破!能预测,低延时,演示效果惊人,外媒称媲美人类翻译...
- MIT新研究:基于基本运动能力让机器人自主学习,感知世界
- Mac系统下安装webpack,cnpm,vue-cli
- 重新编译hadoop-2.7.2-src的native以支持Snappy解压压缩库
- 怎样实现MathType在Numbers中的运用
- SQL查询集合合并成字符串
- switch case 解决字符串选择的问题
- ahjesus 获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome