Description

社交活动中有nnn个男孩和nnn个女孩。

他们玩的其中一场比赛是通过pockypockypocky传递橡皮筋(pockypockypocky是一种长条饼干)。

与正常的社交活动游戏不同,只有两支队伍,男队和女队。

游戏规则如下,

1.两队都有nnn个编号从111到nnn的马甲。

2.对手队将给出长度为mmm的整数序列a1,...,ama_1,...,a_ma1​,...,am​。所有数字将在111到nnn(含nnn)之间,并且所有相邻数字都不相同(对于所有1≤i&lt;m,ai≠ai+11\le i&lt;m,a_i\neq a_{i+1}1≤i<m,ai​̸​=ai+1​)。

3.在对手队给出序列之后,另一队开始计划背心的穿着策略。请注意,团队成员在游戏过程中不能交换背心。

4.当比赛开始时,橡皮筋将被放在穿着a1a_1a1​编号的背心的队员嘴中的pockypockypocky上。 然后,穿着a1a_1a1​编号的背心的队员必须将橡皮筋传递给穿着a2a_2a2​编号的背心的队员,而不能用手,如此进行下去…。当橡皮筋通过m−1m - 1m−1次并且已经在穿着ama_mam​编号的背心的队员的pockypockypocky上时,游戏将结束。

5.第一队完成是胜利的队。

ShikyShikyShiky是算法大师。他从未在任何战略游戏中失利。他相信他会像以前一样赢得这场比赛。

他发现两名队员之间的身高差距越大,他们之间的橡皮筋越难通过。

基于这一观察,他定义了一次传递橡皮筋的难度为身高差的绝对值。

你是ShikyShikyShiky对手队伍的领导者。

你知道ShikyShikyShiky编写了一个程序来计算他的团队难度的最小可能总和。

既然你不想输,你决定为你的团队编写一个具有相同功能的程序。

PS :由于ShikyShikyShiky有女朋友,所以你不能引诱他获取源代码,而且他女朋友没参加这场比赛(233333323333332333333

Input

第一行有两个整数nnn和mmm。 它表明有nnn个男孩和nnn个女孩,而ShikyShikyShiky的团队会给你一个长度为mmm的序列。

第二行有nnn个整数h1,h2...,hnh_1,h_2 ...,h_nh1​,h2​...,hn​,表示你所有团队成员的身高。

第三行有mmm个整数a1,a2...,ama_1,a_2 ...,a_ma1​,a2​...,am​,表示ShikyShikyShiky团队给出的序列。

(1≤n≤20,2≤m≤1000,120≤hi≤240,1≤ai≤n,ai≠ai+1)(1\le n\le 20,2\le m\le 1000,120\le h_i\le 240,1\le a_i\le n,a_i\neq a_{i+1})(1≤n≤20,2≤m≤1000,120≤hi​≤240,1≤ai​≤n,ai​̸​=ai+1​)

Output

输出一个整数表示团队难度的最小可能总和。

Sample Input

3 3
170 175 180
1 2 3

Sample Output

10

Solution

状压DPDPDP,从低到高安排身高,以dp[S]dp[S]dp[S]表示已经给SSS状态的人安排好了前num[S]num[S]num[S]个身高,其中num[S]num[S]num[S]表示SSS二进制表示中111的个数,对于SSS中为111的位置xxx,考虑给xxx身高为hnum[S]h_{num[S]}hnum[S]​,那么把xxx安排进去之后,对团队难度的贡献分为两部分:正部分为xxx与SSS中为111位置yyy的相邻次数,因为yyy的身高必然小于xxx,而负部分为xxx与SSS中为000位置yyy的相邻次数,因为yyy的身高必然大于xxx,记num[x][y]num[x][y]num[x][y]为a1,...,ama_1,...,a_ma1​,...,am​中x,yx,yx,y相邻的次数,那么即可O(n)O(n)O(n)统计该贡献,记为zzz,进而有转移
dp[S]=min(dp[S],dp[S−2x]+z⋅hnum[S])dp[S]=min(dp[S],dp[S-2^x]+z\cdot h_{num[S]}) dp[S]=min(dp[S],dp[S−2x]+z⋅hnum[S]​)
dp[2n−1]dp[2^n-1]dp[2n−1]记为答案,时间复杂度O(n2⋅2n)O(n^2\cdot 2^n)O(n2⋅2n)

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f,maxn=(1<<20)+5;
int n,m,h[22],a[1005],cnt[22][22],dp[maxn],num[maxn];
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&h[i]);sort(h+1,h+n+1);for(int i=1;i<=m;i++){scanf("%d",&a[i]);a[i]--;if(i>1)cnt[a[i]][a[i-1]]++,cnt[a[i-1]][a[i]]++;}int N=1<<n;num[0]=0;for(int i=1;i<N;i++)num[i]=num[i/2]+(i&1);for(int i=1;i<N;i++)dp[i]=INF;dp[0]=0; for(int S=1;S<N;S++)for(int x=0;x<n;x++)if((S>>x)&1){int y=0;for(int i=0;i<n;i++)if((S>>i)&1)y+=cnt[i][x];else y-=cnt[i][x];dp[S]=min(dp[S],dp[S^(1<<x)]+y*h[num[S]]);}printf("%d\n",dp[N-1]);return 0;
}

Newcoder 110 E.Pocky游戏(状压DP)相关推荐

  1. NowCoder110E Pocky游戏 状压DP

    传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...

  2. 牛客练习赛$18E\ pocky$游戏 状压$dp$

    正解:状压$dp$ 解题报告: 传送门$QwQ$ 首先注意下题目,这个$a_i$不是个排列,,,我开始想了好久说这不是傻逼题直接做嘛然后一看样例发现我是傻逼$/dk$ 一个套路,看到绝对值问题一般就是 ...

  3. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

  4. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  5. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  6. HDU - 2825 Wireless Password(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 m 个匹配串,问长度为 n 的字符串中,至少包含 k 个匹配串(可重叠)的字符串有多少个 题目分析:考虑到n,m,k都特别小,所以可以先用AC自动机将状态关系转移出 ...

  7. [NOIP2016]愤怒的小鸟(状压DP)

    [NOIP2016]愤怒的小鸟(状压DP) 题目描述 输入输出格式 输入格式: 第一行包含一个正整数 T,表示游戏的关卡总数. 下面依次输入这 T个关卡的信息.每个关卡第一行包含两个非负整数 n,m, ...

  8. [ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

    一次性写两道题 T1:一个简单的询问 题目 题解 代码实现 T2:愤怒的小鸟 题目 暴搜题解 暴搜代码实现 状压DP题解 状压DP代码实现 T1:一个简单的询问 题目 给你一个长度为 N 的序列 ai ...

  9. HDU 5691 Sitting in Line 状压dp

    Sitting in Line 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 Description 度度熊是他同时代中最伟大的数学家,一切 ...

最新文章

  1. mac镜像cdr格式_设计常用文件格式!萌新必备
  2. 初入股市之 Hello Stock
  3. 2. Leetcode 167. 两数之和 II - 输入有序数组 (数组-双向双指针)
  4. 图像sobel梯度详细计算过程_数字图像处理(第十章)
  5. 学校选址_洛谷U3451_带权中位数
  6. 第三章 表单与表单元素
  7. centos7 改虚拟网卡名称
  8. php数组是否存在数组,php判断数组中是否存在某值
  9. Angr安装与使用之使用篇(九)
  10. 新型开关电源优化设计与实例详解全书.pdf_高频电路设计中,如何应对“不理想”的电容与电感?...
  11. VS2013中添加现有窗体项
  12. 【懒人神器,批量src】Serein,一个可以对无数个网站进行漏洞检测的软件
  13. homebrew php 扩展,Mac homebrew-1.5以后安装php扩展的方法
  14. Lwip从入门到放弃之(一)---基础网络知识扫盲
  15. 一些常用软件静默安装参数(nsis,msi,InstallShield ,Inno)
  16. PDF拆分工具怎么用?如何把一个PDF文件拆分成多个
  17. 【陈鹏老师精益项目实战】华北区防水材料企业精益生产项目第四期启动
  18. 如何把项目改成微服务项目_微服务拆分那点事
  19. jsp页面360浏览器兼容模式不兼容问题解决方法
  20. 2022-2027年中国合成纤维行业市场全景评估及发展战略规划报告

热门文章

  1. 麦子学院学习视频之机器学习(1):1.1 机器学习介绍
  2. JAVA中调用Arrays工具类遇见的问(帮忙指点一下)
  3. 【科普贴】I2C通讯协议详解——偏软件分析和逻辑分析仪实例分析
  4. Java绘图,图像处理
  5. 盘点世界上奇怪的 6 种编程语言
  6. You have enabled checking of packages via GPG keys. This is a good thing.  However, you do not have
  7. 使用yum报错:You could try using --skip-broken to work around the problem
  8. 哈工大软件构造 Git使用
  9. oracle分段时间统计总数,oracle中根据年份统计每月的总数?解决思路
  10. 示波器测量i2c信号实例