题面

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

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll; ll read(){
ll x=,f=;char c=getchar();
while(c<'' || c>''){if(c=='-')f=-;c=getchar();}
while(c>='' && c<=''){x=x*+c-'';c=getchar();}
return x*f;
} char get(){
char c=getchar();
while(c!='.' && c!='*') c=getchar();
return c;
} const int mod=1e9+;
int n,m;
char s[][];
int f[][][][],g[][][][];
int dx[][][]={{{-,-,,,},{,,,,},{,,,,}},{{-,,,,},{,,,,},{,,,,}},{{-,-,,,},{,,,,},{,,,,}}},dy[][][]={{{-,,-,,},{-,,,,},{-,,-,,}},{{,,,,},{,,,,},{,,,,}},{{,,,,},{,,,,},{,,,,}}}; inline void pl(int &a,int b){a=a+b;if(a>mod) a-=mod;}
inline void dec(int &a,int b){a=a-b;if(a<) a+=mod;}
int q,w,e,r; int dp(int a,int b,int c,int d){
//cout<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
if(s[a][b]!=s[c][d]) return ;
if(a< || a>n || b< || b>m || c< || c>n || d< || d>m) return ;
if(f[a][b][c][d]) return f[a][b][c][d];
int sum=;
for(int d1=;d1<;d1++){
if(dx[q][w][d1]== && dy[q][w][d1]==) continue;
int nwa=a+dx[q][w][d1],nwb=b+dy[q][w][d1];
for(int d2=;d2<;d2++){
if(dx[e][r][d2]== && dy[e][r][d2]==) continue;
int nwc=c+dx[e][r][d2],nwd=d+dy[e][r][d2];
pl(sum,dp(nwa,nwb,nwc,nwd));
}
}
return f[a][b][c][d]=sum;
} int solve(int a,int b,int c,int d){
if(g[a+][b+][c+][d+]!=) return g[a+][b+][c+][d+];
memset(f,,sizeof(f));
// cout<<a<<' '<<b<<' '<<c<<' '<<d<<endl;
q=a+,w=b+,e=c+,r=d+;
int ret=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int x=;x<=n;x++)
for(int y=;y<=m;y++)
pl(ret,dp(i,j,x,y));
g[a+][b+][c+][d+]=g[c+][d+][a+][b+]=g[-a][-b][-c][-d]=g[-c][-d][-a][-b]=ret;
return ret;
} int solve(int a,int b){
int ans=;
for(int i=-;i<=;i++)
for(int j=-;j<=;j++){
if(i== && j==) continue;
if(i== || j==) dec(ans,solve(a,b,i,j));
else pl(ans,solve(a,b,i,j));
}
return ans;
} int main(){
#ifdef LZT
freopen("in","r",stdin);
freopen("out2","w",stdout);
#endif
n=read(),m=read();
for(int i=;i<=n;i++)
scanf("%s",s[i]+);
int ans=;
for(int i=-;i<=;i++)
for(int j=-;j<=;j++){
if(i== && j==) continue;
if(i== || j==) dec(ans,solve(i,j));
else pl(ans,solve(i,j));
}
printf("%d\n",ans);
return ;
}

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. 使用脚本删除ios工程中未使用图片

    使用脚本删除ios工程中未使用图片 最近在读唐巧大神的<iOS开发进阶>,学到了一个大招:使用脚本删除ios中未使用的图片(纸书上有点小问题,参考github上的issue:使用脚本删除i ...

  2. iOS之Prefix.pch

    本文转载至 http://blog.csdn.net/lvxiangan/article/details/21325093   Prefix.pch的作用和用法 Hello World_Prefix. ...

  3. kafka 和 zookeeper 常用命令记录

    启动zookeeper zkServer.sh start 启动kafka服务器 kafka-server-start.sh /software/kafka_2.10-0.10.2.1/config/ ...

  4. Get Luffy Out (poj 2723 二分+2-SAT)

    Language: Default Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7969   ...

  5. oracle中去掉文本中的换行符、回车符、制表符

    一.特殊符号ascii定义 制表符 chr(9)  换行符 chr(10) 回车符 chr(13) UPDATE tc_car_order set USE_REASON =  REPLACE('USE ...

  6. webpack 的编译原理

    自从接触了react,vue 这两个框架,都会用到webpack这个打包工具.面试的时候,经常被问到知道webpack的编译原理吗? 可以简单的介绍一下.每每这个时候都被问的哑口无言,平时用的时候挺顺 ...

  7. POJ3111 K Best —— 01分数规划 二分法

    题目链接:http://poj.org/problem?id=3111 K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissio ...

  8. js程序开发-1

    <h1>数组的常用操作</h1> push() 方法可向数组的末尾添加一个或多个元素,并返回新数组的长度. unshift() 方法可向数组的开头添加一个或更多元素,并返回新数 ...

  9. java基础知识一

    1.计算机基础知识概述 (1) 计算机 计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速处 ...

  10. OpenCV2.4.13+VS2012开发环境配置

    1.下载和安装OpenCV SDK 在OpenCV官网的下载页面: http://opencv.org/downloads.html   找到对应OpenCV for Windows版本下载.目前(2 ...