题面

https://www.lydsy.com/JudgeOnline/problem.php?id=4859

题解

和管道取珠类似

首先把平方转化成两条路径经过的图案相同的方案数

对于一条路径 方向一共有8种 分别是 左上 上 右上 左 右 左下 下 右下 (按照起点和终点的位置关系来确定)

我们枚举两个方向 也就是枚举$8 \times 8$ 一共64种方向 注意到对于方向$(a,b)$ 我们发现有其他3种和它是等价的 分别是$(!a,!b),(b,a),(!b,!a)$ (!a 表示a的反方向) 所以实际上只要做$\frac {8 \times 8} {4} =16$种

对于一种情况 我们令$f[a][b][c][d]$表示两条路径的起点分别为$(a,b)$和$(c,d)$的方案数

用记忆化搜索可以算出f数组

然后因为上下左右的四个方向被算了两次 所以得减掉

复杂度$O(16n^4)$

Code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. ll read(){
  6. ll x=,f=;char c=getchar();
  7. while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
  8. while(c>='' && c<=''){x=x*+c-'';c=getchar();}
  9. return x*f;
  10. }
  11.  
  12. char get(){
  13. char c=getchar();
  14. while(c!='.' && c!='*') c=getchar();
  15. return c;
  16. }
  17.  
  18. const int mod=1e9+;
  19. int n,m;
  20. char s[][];
  21. int f[][][][],g[][][][];
  22. int dx[][][]={{{-,-,,,},{,,,,},{,,,,}},{{-,,,,},{,,,,},{,,,,}},{{-,-,,,},{,,,,},{,,,,}}},dy[][][]={{{-,,-,,},{-,,,,},{-,,-,,}},{{,,,,},{,,,,},{,,,,}},{{,,,,},{,,,,},{,,,,}}};
  23.  
  24. inline void pl(int &a,int b){a=a+b;if(a>mod) a-=mod;}
  25. inline void dec(int &a,int b){a=a-b;if(a<) a+=mod;}
  26. int q,w,e,r;
  27.  
  28. int dp(int a,int b,int c,int d){
  29. //cout<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
  30. if(s[a][b]!=s[c][d]) return ;
  31. if(a< || a>n || b< || b>m || c< || c>n || d< || d>m) return ;
  32. if(f[a][b][c][d]) return f[a][b][c][d];
  33. int sum=;
  34. for(int d1=;d1<;d1++){
  35. if(dx[q][w][d1]== && dy[q][w][d1]==) continue;
  36. int nwa=a+dx[q][w][d1],nwb=b+dy[q][w][d1];
  37. for(int d2=;d2<;d2++){
  38. if(dx[e][r][d2]== && dy[e][r][d2]==) continue;
  39. int nwc=c+dx[e][r][d2],nwd=d+dy[e][r][d2];
  40. pl(sum,dp(nwa,nwb,nwc,nwd));
  41. }
  42. }
  43. return f[a][b][c][d]=sum;
  44. }
  45.  
  46. int solve(int a,int b,int c,int d){
  47. if(g[a+][b+][c+][d+]!=) return g[a+][b+][c+][d+];
  48. memset(f,,sizeof(f));
  49. // cout<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
  50. q=a+,w=b+,e=c+,r=d+;
  51. int ret=;
  52. for(int i=;i<=n;i++)
  53. for(int j=;j<=m;j++)
  54. for(int x=;x<=n;x++)
  55. for(int y=;y<=m;y++)
  56. pl(ret,dp(i,j,x,y));
  57. g[a+][b+][c+][d+]=g[c+][d+][a+][b+]=g[-a][-b][-c][-d]=g[-c][-d][-a][-b]=ret;
  58. return ret;
  59. }
  60.  
  61. int solve(int a,int b){
  62. int ans=;
  63. for(int i=-;i<=;i++)
  64. for(int j=-;j<=;j++){
  65. if(i== && j==) continue;
  66. if(i== || j==) dec(ans,solve(a,b,i,j));
  67. else pl(ans,solve(a,b,i,j));
  68. }
  69. return ans;
  70. }
  71.  
  72. int main(){
  73. #ifdef LZT
  74. freopen("in","r",stdin);
  75. freopen("out2","w",stdout);
  76. #endif
  77. n=read(),m=read();
  78. for(int i=;i<=n;i++)
  79. scanf("%s",s[i]+);
  80. int ans=;
  81. for(int i=-;i<=;i++)
  82. for(int j=-;j<=;j++){
  83. if(i== && j==) continue;
  84. if(i== || j==) dec(ans,solve(i,j));
  85. else pl(ans,solve(i,j));
  86. }
  87. printf("%d\n",ans);
  88. return ;
  89. }

Review

1. 注意模数为$10^9+9$ 我一开始写成了$10^9+7$调了半天

bzoj 4859 [BeiJing2017]机动训练的更多相关文章

  1. [BZOJ4859][BJOI2017]机动训练(DP)

    4859: [BeiJing2017]机动训练 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 105  Solved: 63[Submit][Stat ...

  2. P3713 [BJOI2017]机动训练

    这个题简直神仙,求相同路径的平方就等于两个人走相同路径的方案数.然后...暴力搜索+记忆化就行了,比较玄学. 题干: 题目描述 整个岛可以看作一片 n*m 的区域,每个格子有自己的地形. 一条路径由一 ...

  3. BJOI2017 机动训练

    落谷.Loj. Description 定义机动路径为: 没有自环 路径至少包含两个格子 从起点开始每一步都向不远离终点的方向移动 相同地形序列指路径上顺序经过的地形序列. 定义机动路径的权值为相同地 ...

  4. [BZOJ]4908: [BeiJing2017]开车

    Time Limit: 30 Sec  Memory Limit: 256 MB Description 你有n辆车,分别a1, a2, ..., an位置和n个加油站,分别在b1, b2, ... ...

  5. 【LOJ】#2178. 「BJOI2017」机动训练

    题解 遇见平方和就转有序对呗 dp类似从很多点出发每次走一步的转移方式 然后我too naive的,枚举路径长度来决定更新次数,愉快TLE 改成记搜就过了 代码 #include <bits/s ...

  6. bzoj 4860 [BeiJing2017]树的难题

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4860 题解 点分治 设当前重心为v 假设已经把所有边按照出发点第一关键字, 颜色第二关键字排 ...

  7. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  8. BJOI做题记录

    BJOI做题记录 终于想起还要做一下历年省选题了2333 然而咕了的还是比做了的多2333 LOJ #2178. 「BJOI2017」机动训练 咕了. LOJ #2179. 「BJOI2017」树的难 ...

  9. NOI Online #2 提高组 游记

    没 NOI Online 1 挂的惨就来写游记吧,不知道为啥 NOI Online 1 民间数据测得 60 分的 T1 最后爆零了... 昏昏沉沉的醒来,吃了早饭,等到 \(8:30\) 进入比赛网页 ...

随机推荐

  1. @SafeVarargs 使用说明

    说明: @SafeVarargs 是jdk1.7引入的适用于可变参数与泛型能够更好结合的一个注解. 官方解释: 程序员认定带有注释的主体或者构造函数不会对其执行潜在的不安全操作 将此注释应用于未经检查 ...

  2. 值得收藏的45个Python优质资源(附链接)

    REST API:使用 Python,Flask,Flask-RESTful 和 Flask-SQLAlchemy 构建专业的 REST API https://www.udemy.com/rest- ...

  3. 锁粒度 Deadlocks

    锁粒度 MySQL :: MySQL 5.7 Reference Manual :: 14.5.2.4 Locking Reads https://dev.mysql.com/doc/refman/5 ...

  4. sbt is a build tool for Scala, Java, and more

    http://www.scala-sbt.org/0.13/docs/index.html sbt is a build tool for Scala, Java, and more. It requ ...

  5. pyspark 连 MongoDB复制集

    解决问题思路: 核心:0-理解pyspark的执行与java jar的关系: 1-看控制台,看日志: 2-jar缺不缺,版本号,放哪里. [root@hadoop1 mylocalRepository ...

  6. Spring Base

    1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书<Expert one-on-one J2EE Design and Deve ...

  7. Window XP安装Ubuntu14.04实现Samba文件共享

    安装了Ubuntu14.04之后,在虚拟机设置里设置了文件共享.但在mnt文件夹下没有hgfs这个文件夹.依照网上说的去做还是不行,仅仅好放弃.改用samba实现Windows与Ubuntu文件共享. ...

  8. 数据库连接池-配置 wallfilter

    使用缺省配置的WallFilter <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSou ...

  9. @SpringBootApplication 注解

    @SpringBootApplication 启动类注解(一般在root下):该注解被@Configuration.@EnableAutoConfiguration.@ComponentScan 这三 ...

  10. FZU2150 Fire Game —— BFS

    题目链接:https://vjudge.net/problem/FZU-2150 Problem 2150 Fire Game Accept: 2702    Submit: 9240 Time Li ...