题意:HDU3237

nnn本书,每本书有自己的高度xxx,一段连续的高度的书的混乱度为111,不连续的高度的书混乱度为也111,你有kkk次操作移动某些书到任意位置,请问kkk次操作后所有书的最小混乱值。

分析:

高度252525 →\rightarrow→ 323232即000→\rightarrow→777 ,考虑状压压缩。
基本思想: 先取走书(也许是好几本一样的书, 一样的书取走之后肯定丢在一起), 最后再放回去

dp[i][j][s][x]dp[i][j][s][x]dp[i][j][s][x]表示前iii本书取走jjj本书,剩下书的种类的状态为sss, 剩下书的最后一本书为xxx。
它的值表示剩下的书的混乱度。

转移方程为:
设当前这本书为xxx,上一本书为ppp。

I.I.I. 如果当前这本书与前一本书高度相同时(p==x)(p == x)(p==x), 此时肯定不取走:
dp[i][j][s][p]=min(dp[i][j][s][p],dp[i−1][j][s][p]);dp[i][j][s][p] = min(dp[i][j][s][p], dp[i - 1][j][s][p]);dp[i][j][s][p]=min(dp[i][j][s][p],dp[i−1][j][s][p]);
II.II.II. 如果当前这本书与前一本书高度不同时(p!=x)(p != x)(p!=x):
又要分两种情况:
1.1.1.不取走当前这本书
2.2.2.取走当前这本书

1.dp[i][j][s∣(1&lt;&lt;x)][x]=min(dp[i][j][s∣(1&lt;&lt;x)][x],dp[i−1][j][s][p]+1);1. dp[i][j][s | (1 &lt;&lt; x)][x] = min(dp[i][j][s | (1 &lt;&lt; x)][x], dp[i - 1][j][s][p] + 1);1.dp[i][j][s∣(1<<x)][x]=min(dp[i][j][s∣(1<<x)][x],dp[i−1][j][s][p]+1);
2.dp[i][j+1][s][p]=min(dp[i][j+1][s][p],dp[i−1][j][s][p]);2. dp[i][j + 1][s][p] = min(dp[i][j + 1][s][p], dp[i - 1][j][s][p]);2.dp[i][j+1][s][p]=min(dp[i][j+1][s][p],dp[i−1][j][s][p]);

因为我们求的是剩下的书的混乱度, 所以我们还要加上取走的书的混乱度。
枚举dp[n][k][0−&gt;maxState][0−&gt;bit(maxState)]dp[n][k][0 -&gt; maxState][0 -&gt; bit(maxState)]dp[n][k][0−>maxState][0−>bit(maxState)]
然后计算每个状态的补集的1的个数, 就是我们要加上的取走的书的混乱度

最后hduhduhdu上的这题卡内存, 所以滚动数组优化第一维即可.
写的时候还是有很多细节的…

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;const int maxn = 100 + 5;
const int maxm = (1 << 8) + 5;
const int inf  = 0x3f3f3f3f;
const LL  mod  = 1e9 + 7;int n, x, k, cnt, ans, now, sta, cas, res, dp[2][maxn][maxm][10];int main(){ while(~scanf("%d %d", &n, &k) && n + k){memset(dp, inf, sizeof dp);now = sta = 0;for(int i = 0; i < n; i++){scanf("%d", &x), x -= 25;now ^= 1;memset(dp[now], inf, sizeof dp[now]);dp[now][i][1 << x][x] = 1;for(int j = 0; j <= min(i, k); j++){//注意min(i, k)for(int s = sta; s; s = (s - 1) & sta){//枚举子集for(int p = 0; (1 << p) <= s; p++) if(dp[now ^ 1][j][s][p] != inf){if(p == x){dp[now][j][s][x] = min(dp[now][j][s][x], dp[now ^ 1][j][s][x]);}else{dp[now][j][s | (1 << x)][x] = min(dp[now][j][s | (1 << x)][x], dp[now ^ 1][j][s][p] + 1);dp[now][j + 1][s][p] = min(dp[now][j + 1][s][p], dp[now ^ 1][j][s][p]);}}}}sta |= (1 << x);} ans = inf;for(int j = 0; j <= k; j++){for(int s = sta; s; s = (s - 1) & sta){for(int p = 0; (1 << p) <= s; p++) if(dp[now][j][s][p] != inf){res = 0; for(int ss = s ^ sta; ss; ss &= (ss - 1)) res++;ans = min(ans, dp[now][j][s][p] + res);}}}printf("Case %d: %d\n\n", ++cas, ans);}return 0;
}

HDU-3237 Help Bubu(状压dp)相关推荐

  1. HDU 3001 三进制状压DP

    HDU 3001 三进制状压DP N个城市,M条道路,每条道路有其经过的代价,每一个城市最多能够到达两次,求走全然部城市最小代价,起点随意. 三进制状压.存储每一个状态下每一个城市经过的次数. 转移方 ...

  2. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

  3. Tunnels HDU - 4856 (bfs状压dp)

    Tunnels HDU - 4856 Bob is travelling in Xi'an. He finds many secret tunnels beneath the city. In his ...

  4. Hdu 4856 Tunnels(状压dp)

    题目链接 Tunnels Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  5. HDU - 4856 Tunnels(哈密顿路径+状压dp)

    题目链接:点击查看 题目大意:给出一个n*n的正方形网格,其中"."表示可以走的路,"#"表示障碍物,每次可以向上下左右任意方向走1格,花费1单位时间,再给出m ...

  6. hdu 4049 Tourism Planning [ 状压dp ]

    传送门 Tourism Planning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

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

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

  8. HDU 5691 Sitting in Line 状压dp

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

  9. hdu 6149 Valley Numer II(01背包套状压dp)

    题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...

  10. hdu 1074 状压dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题意:有n个作业,对于每一个作业有一个deadline,有一个完成这作业所需要的时间.如果超过d ...

最新文章

  1. WPF DataGrid 绑定DataSet数据 自动生成行号
  2. 代码管理平台之svn
  3. centos7.6查询不到网卡信息
  4. 短信发送:webservice调用第三方接口发送短信
  5. 怎样在excel表格中画斜线并打字_一日一技丨Excel斜线表头如何制作?标题、表头的4个技巧...
  6. php设计模式及案例分析,一个案例来认识PHP经典设计模式 | 张先生博客
  7. 树莓派Java程序运行_树莓派上Java程序作为linux服务并开机自动启动
  8. mysql8.0导入备份_mysql8.0.20配合binlog2sql的配置和简单备份恢复的步骤详解
  9. error LNK2005 已经在***.obj中定义
  10. 任正非谈鸿蒙系统问题不大,任正非谈鸿蒙系统:两三年重建生态,有信心打造全球生态...
  11. DB2一个嵌套循环的sql
  12. 大数据数学基础 python描述下载_正版 大数据数学基础(Python语言描述)Python 大数据 数学 高职-计算机-大数据技术...
  13. 基于四阶累积量的MUSIC算法与MUSIC-like算法(DOA估计)
  14. 松下PLC项目实例,两台CPU间通过RS485通讯,10轴定位控制
  15. 数据分析项目分析之风控建模!!
  16. 单片机-节日彩灯控制器
  17. 数学建模常见算法:插值算法
  18. 从凸函数到Minkowski不等式的推导
  19. .NET 6 RC2 版本发布
  20. 02 视频或语音转文本

热门文章

  1. 云计算零基础(八) 破解密码
  2. html怎么缩进字符间距,css字符间距(css文字间距怎么设置)
  3. java相对路径的写法格式_java相对路径的写法
  4. xcode清理缓存_Mac 垃圾清理软件腾讯柠檬Lemon
  5. 诚信优选团长发红包设计
  6. 电视剧:我的团长我的团
  7. ADO访问Excel 2007
  8. 速学Sql Server从基础到进阶
  9. 第三十一章 SQL命令 DROP DATABASE
  10. 谷歌跟oracle_Google vs Oracle –判决临近,Oracle的知识产权案件步履蹒跚