题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3377


简单路径要求权值最大,那么为了回避括号序列单独插头的情况特判多,考虑使用最小表示法。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. using namespace std;
  9. #define maxn 21
  10. #define inf ((0x7fffffff)-1)
  11. #define llg int
  12. #define sizee 233
  13. #define maxnZT ((1<<20)+1)
  14. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  15. llg n,m,code[maxn],zt[][maxnZT],v[][maxnZT],g[][],size[],now,ne,ans=inf*-;
  16. llg maze[][],val[][],ch[];
  17. void outcode(llg x){for (llg i=;i<=m;i++) code[i]=x&,x>>=;}
  18.  
  19. struct node
  20. {
  21. llg x,val,pos;
  22. };
  23.  
  24. vector<node>a[][sizee];
  25.  
  26. void decode(llg x) {for (llg i=;i<=m;i++) code[i]=x&,x>>=;}
  27.  
  28. void encode(llg p,llg val)
  29. {
  30. for (llg i=;i<=;i++) ch[i]=-;
  31. ch[]=;
  32. llg C=;
  33. for (llg i=;i<=m;i++)
  34. {
  35. if (ch[code[i]]==-) ch[code[i]]=++C;
  36. code[i]=ch[code[i]];
  37. }
  38. llg x=;
  39. for (llg i=;i<=m;i++) x+=code[i]*(<<(i*));
  40. llg wz=x%sizee,E=a[p][wz].size();
  41. for (llg i=;i<E;i++)
  42. if (a[p][wz][i].x==x)
  43. {
  44. a[p][wz][i].val=max(a[p][wz][i].val,val);
  45. v[p][a[p][wz][i].pos]=max(v[p][a[p][wz][i].pos],val);
  46. return ;
  47. }
  48. size[p]++;
  49. node NEW; NEW.x=x; NEW.val=val; NEW.pos=size[p];
  50. a[p][wz].push_back(NEW);
  51. zt[p][size[p]]=x; v[p][size[p]]=val;
  52. }
  53.  
  54. void init_a(llg p){for (llg i=;i<sizee;i++) a[p][i].clear(); size[p]=;}
  55.  
  56. void shift()///换行 移位
  57. {
  58. for(int i=m;i>;i--)
  59. code[i]=code[i-];
  60. code[]=;
  61. }
  62.  
  63. void dp(llg x,llg y)
  64. {
  65. llg left,up,V;
  66. for (llg K=;K<=size[now];K++)
  67. {
  68. decode(zt[now][K]);
  69. left=code[y-],up=code[y];//左上插头
  70. V=v[now][K];
  71. //------------------------------------------------------------
  72. if ((x== && y==))//开始位置
  73. {
  74. if (maze[x][y+])//往左走
  75. {
  76. code[y]=,code[y-]=;
  77. encode(ne,V+val[x][y]);
  78. }
  79. if (maze[x+][y])//往下走
  80. {
  81. code[y-]=,code[y]=;
  82. encode(ne,V+val[x][y]);
  83. }
  84. continue;
  85. }
  86. //------------------------------------------------------------
  87. if (x==n && y==m)//结束位置
  88. {
  89. if ((!left && up) || (left && !up))//必须有且仅有一个插头
  90. {
  91. code[y]=code[y-]=;
  92. bool pd=true;
  93. for (llg t=;t<=m;t++) if (code[t]) pd=false;
  94. if (pd) ans=max(ans,V+val[x][y]);
  95. }
  96. continue;
  97. }
  98. //------------------------------------------------------------
  99. if (left && up)//插头合并
  100. {
  101. if (left!=up)//如果属于同一个连通块则非法(因为形成了环)
  102. {
  103. code[y]=code[y-]=;
  104. for (llg t=;t<=m;t++) if (code[t]==up) code[t]=left;
  105. if (y==m) shift();
  106. encode(ne,V+val[x][y]);
  107. }
  108. continue;
  109. }
  110. //------------------------------------------------------------
  111. if (left || up)//延续原来的连通分量
  112. {
  113. llg tmp;
  114. if (left) tmp=left;else tmp=up;
  115. if (maze[x][y+])
  116. {
  117. code[y-]=,code[y]=tmp;
  118. encode(ne,V+val[x][y]);
  119. }
  120. if (maze[x+][y])
  121. {
  122. code[y-]=tmp,code[y]=;
  123. if (y==m) shift();
  124. encode(ne,V+val[x][y]);
  125. }
  126. }
  127. //------------------------------------------------------------
  128. if (!left && !up)//没有插头,新建连通分量或者不走这一个格子
  129. {
  130. if (maze[x][y+] && maze[x+][y])
  131. {
  132. code[y]=code[y-]=;
  133. encode(ne,V+val[x][y]);
  134. }
  135. code[y]=code[y-]=;
  136. if (y==m) shift();
  137. encode(ne,V);
  138. }
  139. }
  140. }
  141.  
  142. void work()
  143. {
  144. now=,ne=;
  145. encode(now,);
  146. for (llg i=;i<=n;i++)
  147. {
  148. for (llg j=;j<=m;j++)
  149. {
  150. ne=now^;
  151. init_a(ne);
  152. dp(i,j);
  153. now=ne;
  154. }
  155. }
  156. }
  157.  
  158. void init()
  159. {
  160. memset(maze,,sizeof(maze));
  161. for (llg i=;i<=n;i++)
  162. for (llg j=;j<=m;j++)
  163. scanf("%d",&val[i][j]),maze[i][j]=;
  164. }
  165.  
  166. int main()
  167. {
  168. yyj("hdu3377");
  169. llg cas=;
  170. while (scanf("%d%d",&n,&m)!=EOF)
  171. {
  172. ans=inf*-;
  173. cas++;
  174. init();
  175. if (n== && m==)
  176. {
  177. printf("Case %d: %d\n",cas,val[n][m]);
  178. init_a(),init_a();
  179. continue;
  180. }
  181. work();
  182. printf("Case %d: %d\n",cas,ans);
  183. init_a(),init_a();
  184. }
  185. return ;
  186. }

HDU3377 Plan的更多相关文章

  1. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  2. 测试计划(Test Plan)

    测试计划(Test Plan) 版权声明:本文为博主原创文章,未经博主允许不得转载. 测试计划的概念: 测试计划是一个文档,描述了进行测试的测试范围,测试策略和方法,测试资源和进度.是对整个测试活动进 ...

  3. SQL Tuning 基础概述02 - Explain plan的使用

    1.explain plan的使用 SQL> explain plan for delete from t_jingyu; Explained. SQL> select * from ta ...

  4. POJ2175 Evacuation Plan

    Evacuation Plan Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4617   Accepted: 1218   ...

  5. New Plan!

    很久无写过blogs,荒废得差不多了,在博客园虽开bolg 5年多,但由于自己工作的问题,从开始的热情记录,到冷却冰冻,再到现在重拾起来,有一番感受:从大学刚毕业的制作网页菜鸟,开始接触DIV,CSS ...

  6. 分析oracle的执行计划(explain plan)并对对sql进行优化实践

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  7. 【转】Oracle 执行计划(Explain Plan) 说明

    转自:http://blog.chinaunix.net/uid-21187846-id-3022916.html       如果要分析某条SQL的性能问题,通常我们要先看SQL的执行计划,看看SQ ...

  8. MySQL慢查询Explain Plan分析

    Explain Plan 执行计划,包含了一个SELECT(后续版本支持UPDATE等语句)的执行 主要字段 id 编号,从1开始,执行的时候从大到小,相同编号从上到下依次执行. Select_typ ...

  9. Timusoj 1982. Electrification Plan

    http://acm.timus.ru/problem.aspx?space=1&num=1982 1982. Electrification Plan Time limit: 0.5 sec ...

随机推荐

  1. 进程表示之进程ID号

    UNIX进程总是会分配一个号码用于在其命名空间总唯一地标识它们,该号码称作进程ID号,简称PID. 1.进程ID 但每个进程除了PID外,还有其他的ID,有下列几种可能的类型: (1)处于某个线程组中 ...

  2. springboot打war包需要注意事项

    1. pom文件 1.1 添加servlet-api依赖: <!-- 添加servlet-api的依赖--> <dependency> <groupId>org.a ...

  3. Cookie,Session,正则表达式

    一.Cookie和Session基础知识 Cookie:客户端本地存储的键值对 Http访问是不记录状态的,所以要借助session和cookie来保存访问状态  当你在浏览网站的时候,WEB 服务器 ...

  4. Oracle误删除数据恢复

    select * from tablename as of timestamp to_timestamp('2018-05-04 13:30:00','yyyy-MM-dd hh24:mi:ss') ...

  5. yii2项目中运行composer 过程中遇到的问题

    问题1: Your requirements could not be resolved to an installable set of packages 则表明 未安装fxp/composer-a ...

  6. Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源

    Spring Boot 2 (七):Spring Boot 如何解决项目启动时初始化资源 在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等.今天就给大家介绍一个 Spri ...

  7. ora-12705解决方法

    最近使用instant sqlplus测试时,遇到ora-12705,一开始以为是少了配置,经查是,NLS_LANG设置问题,设置为"SIMPLIFIED CHINESE_CHINA.ZHS ...

  8. 鸡兔同笼问题(Java)

    问题描述:编程解决鸡兔同笼问题,笼子中鸡兔共有35只,94只脚,求有鸡和兔各有几只 我的代码: /** * 鸡兔同笼问题 * @author Administrator * */ public cla ...

  9. android之发送Get或Post请求至服务器接口

    import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; imp ...

  10. maven的使用记录

    maven的使用记录 使用的版本为3.6.0. maven配置部署项目 在cmd命令行中切换到Maven项目的根目录,比如:D:/xxxwork/java/maven-test,然后执行命令:$ mv ...