背景

    HNSDFZ的同学们为了庆祝春节,准备排练一场舞

描述

    n个人选出3*m人,排成m组,每组3人。
    站的队形——较矮的2个人站两侧,最高的站中间。
    从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低。
    计算公式为  h=(a-b)^2  (a、b为较矮的2人的身高)
    那么问题来了。
    现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低。

输入格式

    第一排为m,n。
    第二排n个数字,保证升序排列。

输出格式

    输出最小“残疾程度”。

测试样例1

输入

9 40 
1 8 10 16 19 22 27 33 36 40 47 52 56 61 63 71 72 75 81 81 84 88 96 98 103 110 113 118 124 128 129 134 134 139 148 157 157 160 162 164

输出

23

备注

m<=1000,n<=5000
数据保证3*m<=n
 
 
本题源自UVa 10271 Chopsticks

对于这道题,首先应该想到贪心:每次取差值最小的一对。但是这样的贪心策略很容易找到反例,而且N=5000的数据规模,十分有可能是O(n^2)的算法。
于是考虑动态规划。如果是DP,那么很容易想到如下的状态定义:d[i][j]表示用前j个数组成i个(x,y,z)数对的最小消耗。
另外一个很容易注意到的地方就是:对于一个最优决策中的任意一个数对(x,y,z),其中x和y必在有序的a[i]中相邻。关于这点用反证法不难证明,也很容易注意到。
对于(x,y,z)中的z应该如何决策的问题,之前一直令我迷惑,这一点应该是题目最难解决的问题。

考虑状态d[i][j]:
    对于x和y,有如下考虑:
        对于a[j],如果不使用a[j],那么d[i][j]=d[i][j-1];
        如果使用a[j],那么就和a[j-1]一起使用,d[i][j]=d[i-1][j-2]+w(a[i],a[i-1]);
    于是有了总的状态转移方程:d[i][j]=min{d[i][j-1],d[i-1][j-2]+w(a[i],a[i-1])};
    这应该不难理解,但是对于z的决策呢?
    如果把a[i]按降序排列,那么z的影响就可以忽略了!这样依然可以采用上面的方程。

考虑状态d[i][j]:
    如果j<3i,此时当前策略是不可行的,d[i][j]=INF;
    如果j>=3i,即j>=3(i-1)+3,j>3(i-1)+2,当前状态有效
        转移到d[i-1][j-2]时,至少剩余一个多余的a[k]
        由于序列降序,a[k]可以和a[j]、a[j-1]配对
        同时d[i-1][j-2]有效,可以继续递归。
        转移到d[i][j-1]
        若d[i][j-1]为无效状态,d[i][j-1]==INF,必然不会比上面那种转移方式优;
        若d[i][j-1]为有效状态,可以继续递归地进行下去。

 
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int m,n,a[];
long long dp[][];
int main(){
cin>>m>>n;
for(int i = n;i >= ;i--){
scanf("%d",&a[i]);
}
for(int i = ;i <= m;i++){
for(int j = ;j <= n;j++){
if(j < i * ) dp[i][j] = 9876543212345L;
else dp[i][j] = min(dp[i][j-],dp[i-][j-] + (a[j] - a[j-]) * (a[j] - a[j-]));
}
}
cout<<dp[m][n];
return ;
}

tyvj1191 迎春舞会之三人组舞的更多相关文章

  1. Vijos 1061 迎春舞会之三人组舞(DP)

    题目链接 经典DP问题,通过问题,看出结论,然后倒序,然后注意条件. #include <cstdio> #include <cstring> #include <ios ...

  2. Vijos P1061 迎春舞会之三人组舞 DP

    题目链接:https://vijos.org/p/1061 n个人选出3*m人,排成m组,每组3人. 站的队形——较矮的2个人站两侧,最高的站中间. 从对称学角度来欣赏,左右两个人的身高越接近,则这一 ...

  3. VJ1061迎春舞会之三人组舞

    题目链接 推了半个下午..写的三重超时了  加了点单调队列的思想 优化了下过了 dp[i][j] 第二组的最右边的人选第J个人 那最左边肯定选第j-1个人 肯定是选相邻的 dp[i][j] = min ...

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

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

  5. VIJOS-P1064 迎春舞会之数字舞蹈

    洛谷 P1538 迎春舞会之数字舞蹈 洛谷传送门 JDOJ 1245: VIJOS-P1064 迎春舞会之数字舞蹈 JDOJ传送门 Description ​ 在越来越讲究合作的时代,人们注意的更多的 ...

  6. tyvj1192 迎春舞会之集体舞

    背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 描述 表演者排成n排,构成一个向前的正三角形(在屏幕上,即向下).而就每个人,他有可能正面朝前(小的向前正三角形).或向后三角形(小的向后正 ...

  7. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  8. 洛谷 P1538 迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  9. P1538 迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

随机推荐

  1. 用修改hosts的方式来屏蔽某些网站

    首先呢,来自知乎的一些问答:修改 hosts 文件可以上一些墙内屏蔽的网站,其原理是什么? (然而通过增/改hosts的方法来FQ已经失效很久了) 然后呢,也可以通过修改hosts来达到屏蔽某些网站的 ...

  2. 转《WF编程》笔记目录

    <WF编程>笔记目录 2008-03-18 09:33 by Windie Chai, 26803 阅读, 49 评论, 收藏, 编辑 WF笔记开始 <WF编程>系列之0 - ...

  3. POJ3368Frequent values[RMQ 游程编码]

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 17581   Accepted: 6346 ...

  4. AC日记——苹果树 codevs 1228

    1228 苹果树  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 在卡卡的房子外面,有一棵 ...

  5. WINDOW的cmd的命令【转载】

    转载地址:https://zhidao.baidu.com/question/583956458.htmlwinver---------检查windows版本 wmimgmt.msc----打开win ...

  6. typescript实现react中的批次式更新

    欢迎吐槽讨论 前言 笔者在React经常使用setState,在学习过程中作笔记以作总结,欢迎讨论. 关于setState的核心观点 1 . 执行setState不都是异步的. 2 . setStat ...

  7. js动态创建style节点(js文件中添加css)

    ie6 不能 document.createElement('style') 然后append到head标签里.所以就找到这样个好文章 --------------------- 有很多提供动态创建 ...

  8. 【三石jQuery视频教程】01.图片循环展示_再次重发

    之前的文章,由于在博文的底部放有微信公众号的缘故,被管理员判定为: 您好,您的这篇博文内容本身没什么问题,但是,在博文底部存在推广信息内容.... 你们也没告知到底是哪条触犯了博客园的规矩,我就把底部 ...

  9. C#接口和抽象类的区别

    大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料.      一.抽象类:      抽象类是特殊的类,只是不能被实例化:除 ...

  10. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(三)

    采用之前的源码运行后,我们发现 只有一个配置信息 即servers=127.0.0.1:11211,即 Couchbase Server的服务所在ip 和端口,此时数据直接存在 default 中 根 ...