题面

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. RC4算法的Python实现详注

    刚对RC4算法进行了学习,网上发现https://ju.outofmemory.cn/entry/46753 中作者展示了RC4的python实现,但代码缺乏注释,较为晦涩,因此本文对部分代码进行了注 ...

  2. STL--map用法

    STL--map用法map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力由于这个特性它完成有可能在我们处理 ...

  3. mysql优化-----多列索引的左前缀规则

    索引优化策略 :索引类型 .1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用. 注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎 ...

  4. Spring boot 使用Junt

    //@RunWith:启动器,SpringJUnit4ClassRunner:Spring整合JUnit4 //@SpringBootTest获取启动类,相当于@Contextconfiguartio ...

  5. chmod更改文件的权限

    #include "apue.h" int main(int argc,char *argv[]) { struct stat stabuf; ) err_sys("st ...

  6. ODC(Orthogonal Defect Classification)简介——正交缺陷分类法

    Defect分析是软件开发和测试中一个重要的环节,ODC介绍了一种不同于大家常用的非常有效的defect分类及分析方法.这篇文章简单的向大家介绍了什么是ODC,以及如何在项目和产品开发中使用ODC来改 ...

  7. uestc 250 windy数(数位dp)

    题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路:数位dp #include<iostream ...

  8. mac系统下查看端口占用情况

    localhost:~ mhx$  lsof -i tcp:8080 COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NA ...

  9. 全排列 STL

    #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; int ...

  10. CoderForces343D:Water Tree(dfs序+线段树&&特殊处理)

    Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...