题面

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. centos 安装php7 memcached扩展

    在使用下面这种方式安装php7 memcached扩展时,先要安装好memcached服务器yum -y install php70w-pecl-memcached

  2. HDU 6058 Kanade's sum 二分,链表

    Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...

  3. 初识Restful(学习笔记)

    什么是Restful? REST -- Resource Representational State Transfer(表现层状态转移) 本质上是一种优雅的URL表达方式,描述资源的状态和状态的转移 ...

  4. 用 querySelectorAll 来查询 DOM 节点

    用 querySelectorAll 来查询 DOM 节点 Document.querySelectorAll - Web API 接口 | MDN https://developer.mozilla ...

  5. luogu2704 炮兵阵地 状态压缩DP

    题目大意:一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),在每一格平原地形上最多可以布置一支炮兵部队,能攻击到的区域:沿横向左右各两格,沿纵向上 ...

  6. [翻译]Unity中的AssetBundle详解(三)

    构建AssetBundles 在AssetBundle工作流程的文档中,我们有一个示例代码,它将三个参数传递给BuildPipeline.BuildAssetBundles函数.让我们更深入地了解我们 ...

  7. ie67 display:inline-block 失效解决方法

    先将其转化为块状,在转化为inline,*号为css hcak,代表针对IE67 display: inline-block; *display: block; *display: inline;

  8. vue2实现自定义样式radio单选框

    先上效果 <div class="reply"> 主编已回复: <div class="radio-box" v-for="(ite ...

  9. ES6 解构赋值的常见用途,很强大

    字符串 var [a,b,c,d,e] = "hello"; console.log(a); // h console.log(b); // e console.log(c); / ...

  10. Pycharm中如何安装python库

    1首先打开pycharm工具,选择File中的Setting选项,如下图所示 2在打开的setting界面中我们点击python的解释器,你会看到很多导入的第三方库,如下图所示,点击最右边的加号 3在 ...