Sitting in Line

题目连接:

http://acm.hdu.edu.cn/showproblem.php?pid=5691

Description

度度熊是他同时代中最伟大的数学家,一切数字都要听命于他。现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了。游戏的规则十分简单,参与游戏的N个整数将会做成一排,他们将通过不断交换自己的位置,最终达到所有相邻两数乘积的和最大的目的,参与游戏的数字有整数也有负数。度度熊为了在他的数字仆人面前展现他的权威,他规定某些数字只能在坐固定的位置上,没有被度度熊限制的数字则可以自由地交换位置。

Input

第一行一个整数T,表示T组数据。
每组测试数据将以如下格式从标准输入读入:

N

a1p1

a2p2

:

aNPN

第一行,整数 N(1≤N≤16),代表参与游戏的整数的个数。

从第二行到第 (N+1) 行,每行两个整数,ai(−10000≤ai≤10000)、pi(pi=−1 或 0≤pi<N),以空格分割。ai代表参与游戏的数字的值,pi代表度度熊为该数字指定的位置,如果pi=−1,代表该数字的位置不被限制。度度熊保证不会为两个数字指定相同的位置。

Output

第一行输出:"Case #i:"。i代表第i组测试数据。

第二行输出数字重新排列后最大的所有相邻两数乘积的和,即max{a1⋅a2+a2⋅a3+......+aN−1⋅aN}。

Sample Input

2
6
-1 0
2 1
-3 2
4 3
-5 4
6 5
5
40 -1
50 -1
30 -1
20 -1
10 -1

Sample Output

Case #1:
-70
Case #2:
4600

Hint

题意

题解:

状压dp

dp[i][j]表示状态为i的时候,最后一个是j的最大值

然后直接转移就好了,现在他是第几个,就是前面有多少个1就好了

这个可以预处理出来

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <conio.h>using namespace std;const int maxn = 16;
const int inf = 2e9;int dp[1 << 16][17];int p[maxn] , N , a[maxn] , counter[1 << 16];inline void Update( int & x , int v ){x = max( x , v );
}int main(){int Case , cas = 0;scanf("%d",&Case);for(int i = 0 ; i < ( 1 << 16) ; ++ i) counter[i] = __builtin_popcount(i);while(Case--){scanf("%d",&N);for(int j = 0 ; j < ( 1 << N ) ; ++ j ) for(int k = 0 ; k <= N ; ++ k) dp[j][k] = -inf;for(int i = 0 ; i < N ; ++ i){scanf("%d%d" , a + i , p + i );}a[N] = 0;dp[0][N]=0;for(int i = 0 ; i < ( 1 << N) ; ++ i)for(int j = 0 ; j <= N ; ++ j)if( dp[i][j] != - inf )for(int v = 0 ; v < N ; ++ v)if(  ( (i >> v & 1) == 0) && ( p[v] == -1 || p[v] == counter[i] ) )Update( dp[i | ( 1 << v )][ v ] , dp[i][j] + a[j] * a[v] );int ans = -inf;for(int i = 0 ; i <= N ; ++ i ) Update( ans , dp[ (1<<N)-1 ][i] );printf("Case #%d:\n" , ++ cas);printf("%d\n" , ans);}return 0;
}

转载于:https://www.cnblogs.com/qscqesze/p/5516139.html

HDU 5691 Sitting in Line 状压dp相关推荐

  1. HDU - 4856 Tunnels (预处理+状压dp)

    HDU - 4856 Tunnels (预处理+状压dp) [hud链接] [vj链接] 题目 Problem Description Bob is travelling in Xi'an. He f ...

  2. hdu 5691 Sitting in Line

    传送门 Sitting in Line Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/O ...

  3. HDU 4899 Hero meet devil (状压DP, DP预处理)

    题意:给你一个基因序列s(只有A,T,C,G四个字符,假设长度为n),问长度为m的基因序列s1中与给定的基因序列LCS是0,1......n的有多少个? 思路:最直接的方法是暴力枚举长度为m的串,然后 ...

  4. HDU 5691 ——Sitting in Line——————【状压动规】

    Sitting in Line Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Other ...

  5. HDU 3001 Travelling (三进制状压dp)

    题意 n(n<=10)n(n个城市,知道每个城市间的旅行费用,但每个城市最多走两遍.问最小花费是多少 . 也就是每个城市可以走两次的tsp问题. 分析 最多走两次,三进制0 1 2可满足,即用三 ...

  6. hdu_5691_Sitting in Line(状压DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5691 题意:中文,不解释 题解:设dp[i][j]表示当前状态为i,以第j个数为末尾的最忧解,然后dp ...

  7. HDU 4114 Disney's FastPass(状压dp)

    题意就是给你一些点,有的地方有景区,有的地方有某些景点的优先票,拿优先票去景点和不拿的时间不一样.问从地点1出发去所有景点再回来的最短时间. 得把景点,景区进行状压.即dp[i][j][k]代表参观景 ...

  8. HDU 4856 Tunnels(BFS+状压DP)

    HDU 4856 Tunnels 题目链接 题意:给定一些管道.然后管道之间走是不用时间的,陆地上有障碍.陆地上走一步花费时间1,求遍历全部管道须要的最短时间.每一个管道仅仅能走一次 思路:先BFS预 ...

  9. hdu 4114 Disney's FastPass 状压dp

    点击打开链接 题意: 游戏园里有N个区域,有M条边连接这N个区域,有K个要访问的景点.对于每个景点告诉你这个景点所在的区域,要访问这个景点需要等待一定时间,如果没有FastPass,等待时间有Ti,否 ...

最新文章

  1. python 管道 异步读取 select_Python通过select实现异步IO的方法
  2. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
  3. SpringBoot自动化配置的注解开关原理
  4. *【Hihocoder - offer编程练习赛94 - A】最短管道距离(中位数)
  5. stringreader_Java StringReader skip()方法与示例
  6. 安装Visual Studio2013
  7. spark学习-54-Spark RDD的clean()方法
  8. java settitle 源码_在其他初始化方法中折叠工具栏的setTitle - java代码 - 源码查
  9. .Net Core控制台应用加载读取Json配置文件
  10. C#:XML操作类--转
  11. Linux后台运行进程命令
  12. httpsecurity 类方法介绍_java知识学习25-内部类 - 那种意境
  13. java中随机字符串生成器_java随机字符串生成器
  14. LidarSLAM(一):NDT
  15. C++之STL空间置配器
  16. pass语句|python
  17. 【报错】WebSocket connection to ‘ws://xxx.xxx.x.xxxx:8080/ws‘failed:
  18. Python基础教程(第3版)读书笔记:第3章 使用字符串
  19. iOS企业版分发关于plist和证书的那些事
  20. ssh总断 (by quqi99)

热门文章

  1. 《你的灯亮着吗》读后感1
  2. (027) Linux之shell分支if语句
  3. foreach语句的的解析
  4. display函数怎么使用_使用网络构建复杂布局超实用的技巧,赶紧收藏吧
  5. Jacobian 和Hessian矩阵
  6. LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
  7. java怎么把system.out的东西输出到文件上
  8. linux uboot启动流程分析,uboot启动流程分析
  9. android 5.0 新功能,Android 5.0新特性有哪些?安卓5.0新功能汇总
  10. plsql 设置鼠标行执行_如何制作键盘鼠标产品质量合格证