传送门

Sitting in Line

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 293    Accepted Submission(s): 143

Problem 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
 
Source
 
Recommend
wange2014   |   We have carefully selected several similar problems for you:  5695 5694 5693 5692 5690 
 
 
 
题意:
数组中有些元素位置被固定了,有些可以换位置,求
max{a1⋅a2+a2⋅a3+......+aN−1⋅aN}
 
题解:
真不容易,田神给我说了思路,还编了好久2333

状压dp,比赛时没时间思考了。。。

其实,观察所要求的max{a1⋅a2+a2⋅a3+......+aN−1⋅aN}

可以发现,你发完前 i - 1 位 元素后,准备放第 i 位 元素时,当前的 max 只 与 a[i-1] 有关了 (a[i - 1] * a[i]),所以可以用状压dp

定义 dp[o][i] 为放完第i位(以a[i] 为结尾),状态 o 时的max

遍历的顺序见代码

17232841 2016-05-21 22:22:30 Accepted 5691 1294MS 11724K 2946B G++ czy
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. #define N 19
  11. #define ll long long
  12.  
  13. ll ma;
  14. ll a[N];
  15. int p[N];
  16. int have[N];
  17. int n;
  18. ll dp[ ( << ) ][N];
  19. int tot;
  20. ll inf;
  21. vector<int> G[N];
  22.  
  23. int cal(int x)
  24. {
  25. int ret = ;
  26. while(x){
  27. ret += (x & );
  28. x /= ;
  29. }
  30. return ret;
  31. }
  32.  
  33. void ini()
  34. {
  35. int o;
  36. for(o = ;o < n;o++){
  37. G[o].clear();
  38. }
  39. for(o = ;o < tot;o++){
  40. G[ cal(o) ].push_back(o);
  41. }
  42. }
  43.  
  44. int main()
  45. {
  46.  
  47. int T;
  48. //freopen("in.txt","r",stdin);
  49. //freopen("out.txt","w",stdout);
  50. scanf("%d",&T);
  51. for(int ccnt = ;ccnt <= T;ccnt++){
  52. scanf("%d",&n);
  53. inf = (1LL << );
  54. ma = -inf;
  55. tot = ( << n);
  56. ini();
  57. int i;
  58. memset(have,-,sizeof(have));
  59. for(i = ;i < n;i++){
  60. scanf("%I64d%d",&a[i],&p[i]);
  61. if(p[i] != -){
  62. have[ p[i] ] = i;
  63. }
  64. }
  65. int o,nt;
  66. for(o = ;o < tot;o++){
  67. for(i = ;i < n;i++){
  68. dp[o][i] = -inf;
  69. }
  70. }
  71. for(i = ;i < n;i++){
  72. if(p[i] == || p[i] == -){ //放在第一个
  73. dp[ ( << i) ][i] = ;
  74. }
  75. }
  76.  
  77. /*
  78. for(i = 0;i < n;i++){
  79. for(int j = 0;j < G[i].size();j++){
  80. printf(" i =%d j = %d g= %d\n",i,j,G[i][j]);
  81. }
  82. }*/
  83. for(i = ;i < n;i++){ //放第i位
  84. int sz = G[i].size();
  85. for(int j = ;j < sz;j++){ //遍历含有i个1的所有数
  86. o = G[i][j];
  87. for(int k = ;k < n;k++) //把第k个数放在第i位
  88. {
  89.  
  90. if( o & ( << k) ) continue; //k已经放了
  91. if( p[k] != - && p[k] != i ) continue; //k被固定了
  92. if( have[i] != - && have[i] != k ) continue; //位置i被固定了
  93. nt = o | ( << k);
  94. //printf(" i = %d o = %d k = %d nt = %d\n",i,o,k,nt);
  95. for(int pr = ;pr < n;pr++){
  96. if( (o & ( << pr ) ) == ) continue; //pr不在o里
  97. if( dp[o][pr] == -inf ) continue;
  98. //printf(" i = %d o = %d k = %d nt = %d pr = %d\n",i,o,k,nt,pr);
  99. dp[nt][k] = max(dp[nt][k],dp[o][pr] + a[pr] * a[k]);
  100. }
  101. }
  102. }
  103. }
  104. /*
  105. for(o = 0;o < tot;o++){
  106. for(i = 0;i < n;i++){
  107. printf(" o = %d i = %d dp = %I64d\n",o,i,dp[o][i]);
  108. }
  109. }*/
  110. for(i = ;i < n;i++){
  111. ma = max(ma,dp[tot - ][i]);
  112. }
  113. printf("Case #%d:\n",ccnt);
  114. printf("%I64d\n",ma);
  115. }
  116.  
  117. return ;
  118. }

hdu 5691 Sitting in Line的更多相关文章

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

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

  2. hdu 5691 Sitting in line 状压动归

    在本题中,n<=16n<=16n<=16, 不难想到可以将所选数字的编号进行状态压缩. 定义状态 dp[S][j]dp[S][j]dp[S][j],其中 SSS 代表当前所选出的所有 ...

  3. hdu 5691 Sitting in Line 状压dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5691 题解: 和tsp用的状压差不多,就是固定了一些访问顺序. dp[i][j]表示前cnt个点中布 ...

  4. 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

    Sitting in Line Problem Description   度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...

  5. HDU5691 Sitting in Line【状压DP】

    HDU5691 Sitting in Line 题意: 给出\(n\)个数字,有些数字的位置固定了,现在要求把所有没固定的数字放在一个位置,使得任意相邻两个位置的数字的相乘的和最大 题解: \(n\) ...

  6. hdu 5691(状压DP) Sitting in Line

    题目http://acm.hdu.edu.cn/showproblem.php?pid=5691 状态DP,dp[i][j],i 表示的是一种状态,这个状态指的是当前这个数取或不取,j表示的是以第j个 ...

  7. HDU 3623 Best Cow Line, Gold(模拟,注意思路,简单)

    题目 POJ 3617 和 这道题题目一样,只是范围稍稍再小一点. //模拟试试 #include<stdio.h> #include<string.h> #include&l ...

  8. hdu5691 Sitting in Line(状压dp)

    1 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  9. 2016百度之星 初赛2A ABEF

    只做了1001 1002 1005 1006.剩下2题可能以后补? http://acm.hdu.edu.cn/search.php?field=problem&key=2016%22%B0% ...

随机推荐

  1. 高精度A+B

    #include<stdio.h> #include<string.h> int main() { int lenth1,lenth2,n,i,j,k,s; scanf(&qu ...

  2. Jordan 标准型的实例

    将学习到什么 练习一下如何把一个矩阵化为 Jordan 标准型.   将矩阵化为 Jordan 标准型需要三步: 第一步 求出矩阵 \(A \in M_n\) 全部的特征值 \(\lambda_1,\ ...

  3. CPP-网络/通信:POST

    BOOL PostSubmit(CString strUrl,const CString&strPara, CString&strContent){ BOOL bRet=FALSE; ...

  4. HITICS || 2018大作业 程序人生 Hello's P2P

    摘  要 本文通过分析一个hello.c的完整的生命周期,从它开始被编译,到被汇编.链接.在进程中运行,讲解了Linux计算机系统执行一个程序的完整过程. 关键词:操作系统,进程,程序的生命周期 目 ...

  5. spark 省份次数统计实例

    //统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...

  6. 自己开发一个APP需要多少钱

    广州APP开发公司[启汇网络]经常遇到有开发定制APP软件需求的企业,通常第一句问的就是“开发一款APP需要多少钱”,在做完客户行业的市场调查后,再了解客... 广州APP开发公司[启汇网络]经常遇到 ...

  7. 搭建SSI开发框架原理

    Spring2.5.Struts2.Ibatis开发框架搭建(一) ssi, ibatis 一.框架下载 1.1   Struts2框架 Struts2框架发展于WebWork,现在捐献给了Apach ...

  8. PAT Basic 1015

    1015 德才论 宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其 ...

  9. vue.js 利用SocketCluster实现动态添加数据及排序

    直接上代码 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  10. IOS UITest 初始化 ViewController

    import XCTest @testable import UITestDemo class UITestDemoTests: XCTestCase { var homevc:HomeViewCon ...