链接

思路借鉴了这个博客

我们可以想到状压dp

用一个十进制数来表示状态,即第i位表示位置i处的物品等级

用f[i][j][k]表示第i天,仓库的物品等级为j,状态为k时的最大收益

但是状态数貌似很多,开不下,同时上面的式子好像不太好转移

我们可以预处理出所有的合法状态,即无法消除的状态,然后在预处理出所有状态可能的转移,即枚举空位放那些等级的物品,用e[i][j][k]表示状态i,在第k个空位填等级为j的物品会转移到的状态编号,dis[i][j][k]表示这种转移所得到的收益,这样就方便转移了

注意到我们还要考虑到仓库中的物品,即会有f[i][j][k]转移到f[i][0][s]的情况,所以我们枚举第二维的顺序应该是倒序枚举(即最后考虑f[i][0]的状态)

细节有点多,注意不要写挂

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. const int mn = ;
  10. const int maxn = ;
  11. const int mx = ;//状态总数
  12.  
  13. char s[maxn];
  14. int n,m,a[mn],b[mn],cnt,g[maxn];
  15. int sit[mn],id[];
  16. int e[mx][mn][mn],dis[mx][mn][mn],head[mx];
  17.  
  18. int xiao(int *a,int pos,int &val)
  19. {
  20. val=;
  21. while(a[pos])
  22. {
  23. int tmp=a[pos],l=pos,r=pos;
  24. while(a[l]==a[l-] && l>) l--;
  25. while(a[r]==a[r+] && r<n) r++;
  26. if(l==r) break;
  27. val+=(r-l+)*(<<tmp);
  28. for(int i=l;i<=r;i++)
  29. a[i]=;
  30. a[pos]=(tmp+)%;
  31. }
  32. int tmp=;
  33. for(int i=;i<=n;i++)
  34. tmp=tmp*+a[i];
  35. if(!id[tmp]) id[tmp]=++cnt;
  36. return id[tmp];
  37. }
  38.  
  39. void dfs(int x)
  40. {
  41. //printf("%d\n",x);
  42. if(x>n)
  43. {
  44. int now = xiao(a,,b[]);
  45. for(int i=;i<=n;i++)
  46. {
  47. if(!a[i])
  48. {
  49. ++head[now];
  50. for(int j=;j<=;j++)
  51. {
  52. for(int k=;k<=n;k++)
  53. b[k]=a[k];
  54. b[i]=j;
  55. e[now][j][head[now]] = xiao(b,i,dis[now][j][head[now]]);
  56. }
  57. }
  58. }
  59. return ;
  60. }
  61. for(int i=;i<=;i++)
  62. {
  63. if(x== || !a[x-] || !i || a[x-]!=i)
  64. {
  65. a[x]=i;
  66. dfs(x+);
  67. }
  68. }
  69. }
  70. int f[maxn][mn][mx];
  71. int dp()
  72. {
  73. memset(f,-,sizeof(f));
  74. int ans=;
  75. f[][][]=;
  76. for(int i=;i<=m;i++)
  77. for(int k=;k>=;k--)
  78. for(int j=;j<=cnt;j++)
  79. {
  80. if(f[i][k][j]>=)
  81. {
  82. if(i<m)
  83. {
  84. for(int s=;s<=head[j];s++)
  85. f[i+][k][e[j][g[i+]][s]]=max(f[i+][k][e[j][g[i+]][s]],f[i][k][j]+dis[j][g[i+]][s]);
  86. }
  87. if(k)
  88. {
  89. for(int s=;s<=head[j];s++)
  90. f[i][][e[j][k][s]]=max(f[i][][e[j][k][s]],f[i][k][j]+dis[j][k][s]);
  91. }
  92. else f[i+][g[i+]][j]=max(f[i+][g[i+]][j],f[i][k][j]);
  93. ans=max(ans,f[i][k][j]);
  94. }
  95. }
  96. return ans;
  97. }
  98. int main()
  99. {
  100. scanf("%d%d",&n,&m);
  101. scanf("%s",s+);
  102. for(int i=;i<=m;i++)
  103. g[i]=s[i]-'';
  104. dfs();
  105. printf("%d\n",dp());
  106. return ;
  107. }

BZOJ 4420二重镇题解的更多相关文章

  1. BZOJ 1003 物流运输 题解 【SPFA+DP】

    BZOJ 1003 物流运输 题解 Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的 ...

  2. BZOJ 1191 超级英雄 Hero 题解

    BZOJ 1191 超级英雄 Hero 题解 Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金 ...

  3. bzoj 4822~4824 CQOI2017题解

    老C的任务 题目大意: 维护一个二维平面,初始给出一些点及其权.多次询问某个矩形内的权和. n,m <= 100000 题解: 签到题. CDQ水一水. #include <cstdio& ...

  4. SDOI 2018二轮题解(除Day2T1)

    博主诈尸啦 虽然一轮之后就退役了但是二轮还是要去划划水呀~ 然鹅学了不到一个月文化课再回来看OI的东西有一种恍如隔世的感觉,烤前感觉也没啥可复习的,就补一补去年二轮的题吧. 题目思路基本都参考自sha ...

  5. Bzoj 近期题目一句话题解

    目录 Bzoj 近期题目题解 1000: A+B Problem (模拟) 1008: [HNOI2008]越狱 (容斥) 1012: [JSOI2008]最大数maxnumber (线段树) 103 ...

  6. BZOJ 1~10 精简题解

    从这星期起,我开始了怒刷BZOJ的旅程.这几天刷了10道题(由于"档期"的原因,所以有几道题没打完-..捂脸--..) 精简题解: 1000 A+B Problem --.. [B ...

  7. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

  8. BZOJ 4247: 挂饰 题解

    Description JOI君有N个装在手机上的挂饰,编号为1...N. JOI君可以将其中的一些装在手机上. JOI君的挂饰有一些与众不同--其中的一些挂饰附有可以挂其他挂件的挂钩.每个挂件要么直 ...

  9. 【待填坑】bzoj上WC的题解

    之前在bzoj上做了几道WC的题目,现在整理一下 bzoj2115 去膜拜莫队的<高斯消元解xor方程组> bzoj2597 LCT维护MST bzoj1758 分数规划+树分治+单调队列 ...

随机推荐

  1. 汇编语言LAHF和SAHF指令

    LAHF(加载状态标志位到 AH)指令将 EFLAGS 寄存器的低字节复制到 AH.被复制的标志位包括:符号标志位.零标志位.辅助进位标志位.奇偶标志位和进位标志位.使用这条指令,可以方便地把标志位副 ...

  2. 03.Hibernate配置文件之核心配置文件

    一.核心配置文件的两种配置方式 1.属性文件方式 hibernate.properties(基本不会选用 hibernate.connection.driver_class=com.mysql.jdb ...

  3. 乐观、悲观锁、redis分布式锁

    悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给 ...

  4. C动态分配内存

    malloc分配内存时不初始化,calloc分配内存并进行初始化.

  5. [转]js模块化——AMD及require.js

    由CommonJS组织提出了许多新的JavaScript架构方案和标准,希望能为前端开发提供统一的指引.AMD规范就是其中比较著名一个,全称是Asynchronous Module Definitio ...

  6. gitlab merge request

    分支提了mr之后, 又有commit 不用重新提mr,mr中会自动更新 要保证项目下的.git目录中有hooks这个目录(如果是从github迁移到gitlab的项目, 可能没有这个目录, 导致mr不 ...

  7. javascript中json对象与json字符串

    var data = "{'name':'张山','age':20}"; //转换字符串为json对象: var jsondata = JSON.parse(data); //转换 ...

  8. 左神算法书籍《程序员代码面试指南》——2_02在单链表和双链表中删除倒数第k个字节

    [题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表, ...

  9. DOM4J -(XML解析包)

    DOM4J - 简介 是dom4j.org出品的一个开源XML解析包.Dom4j是一个易用的.开源的库,用于XML,XPath和XSLT.它应用于Java平台,采用了Java集合框架并完全支持DOM, ...

  10. 常见Idea插件

    一.Maven Helper Maven Helper用来查找和排除Jar包冲突的依赖关系. 安装: 打开Idea的Settings→Plugins→在输入框中输入“maven helper”→点击I ...