这个题简直神仙,求相同路径的平方就等于两个人走相同路径的方案数。然后。。。暴力搜索+记忆化就行了,比较玄学。

题干:

题目描述

整个岛可以看作一片 n*m 的区域,每个格子有自己的地形。

一条路径由一系列八连通的格子组成,两个格子八连通当且仅当这两个格子拥有公共的

顶点。

定义一条“机动路径”如下:

、它是一条不自交的路径,即路径上任意两个格子都不是同一个

、它的起点和终点处于不同位置,换言之这条路径至少包含  个格子

、从起点开始,任何一步只能向不远离终点的方向移动,这里不远离指的是 x 和 y 两

个方向都不远离

举例说明(字符画需要用等宽字体查看):

.....y ...... .---.
-++... ---... .-x-.
-x+... -x+..y .-+-.
---... ---... ..y.. 图中加号和减号标明了与 x 八连通的所有格子,其中加号是“不远离 y”的方向 因此可以看出,如下路径是机动路径: ++++++y ......+y .......y
+...... .....++. ......+.
+...... ..++++.. ...+++..
x...... x++..... x+++.... 而如下路径不是机动路径: \../---y .......y .x.
|--..... ....../. /..
|....... x..../.. \..
x....... .\--/... .y. 需要注意的是,某些不合法的路径甚至比机动路径还要短,这是因为机动路径不是按照 长度来定义的。 接下来定义一条机动路径的地形,岛上的地形由一个矩阵给出,如 .**.
*..*
*..*
.**.
那么,一条机动路径的地形序列就是它所经过的地形排成一列,如
x-\.
...\
...|
...y 的地形序列就是".****."(不包含引号) 每条机动路径的权重就是与之拥有相同地形序列的机动路径数量之和,例如与这条路径 拥有相同地形序列的路径有 ./-y y... ...x x-\. ./-x x... ...y y-\.
/... |... ...| ...\ /... |... ...| ...\
|... \... .../ ...| |... \... .../ ...|
x... .\-x y-/. ...y y... .\-y x-/. ...x 共 条,注意回文时正反算两条,以及自己也算一条。 所以这条机动路径的权重是 ,同时所有这 条机动路径的权重都是 。 现在你需要统计所有的机动路径权重之和。 如果对这种统计方式没有直观的感受,可以查看样例说明。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N = ,mod = ;
int n,m,f[N][N][N][N],g[][][][],ans;
int dx[],dy[],dp[],dq[],tp1,tp2;
char str[N][N];
int DP(int x,int y,int p,int q)
{
if(str[x][y] != str[p][q]) return ;
if(x < || x > n || y < || y > m) return ;
if(p < || p > n || q < || q > m) return ;
if(f[x][y][p][q] != -) return f[x][y][p][q];
int res = ;
duke(i,,tp1)
{
duke(j,,tp2)
{
res = (res + DP(x + dx[i],y + dy[i],p + dp[j],q + dq[j])) % mod;
}
}
return f[x][y][p][q] = res;
}
int Calc(int x,int y,int p,int q)
{
if(g[x + ][y + ][p + ][q + ] != -) return g[x + ][y + ][p + ][q + ];
tp1 = ;
duke(i,-,)
{
if(!i || i == x)
{
duke(j,-,)
{
if((i || j) && (!j || j == y))
{
tp1++;
dx[tp1] = i;
dy[tp1] = j;
}
}
}
}
tp2 = ;
duke(i,-,)
{
if(!i || i == p)
{
duke(j,-,)
{
if((i || j) && (!j || j == q))
{
tp2++;
dp[tp2] = i;
dq[tp2] = j;
}
}
}
}
int res = ;
memset(f,-,sizeof(f));
duke(i,,n)
{
duke(j,,m)
{
duke(k,,n)
{
duke(l,,m)
{
res = (res + DP(i,j,k,l)) % mod;
}
}
}
}
g[x + ][y + ][p + ][q + ] = res;
g[p + ][q + ][x + ][y + ] = res;
g[-x + ][-y + ][-p + ][-q + ] = res;
g[-p + ][-q + ][-x + ][-y + ] = res;
return res;
}
int calc(int x,int y)
{
int res = ;
res = (res + Calc(x,y,,)) % mod;
res = (res + Calc(x,y,,-)) % mod;
res = (res + Calc(x,y,-,)) % mod;
res = (res + Calc(x,y,-,-)) % mod;
res = (res - Calc(x,y,,) + mod) % mod;
res = (res - Calc(x,y,-,) + mod) % mod;
res = (res - Calc(x,y,,) + mod) % mod;
res = (res - Calc(x,y,,-) + mod) % mod;
return res;
}
int main()
{
read(n);read(m);
duke(i,,n)
{
scanf("%s",str[i] + );
}
memset(g,-,sizeof(g));
ans = (ans + calc(,)) % mod;
ans = (ans + calc(,-)) % mod;
ans = (ans + calc(-,)) % mod;
ans = (ans + calc(-,-)) % mod;
ans = (ans - calc(,) + mod) % mod;
ans = (ans - calc(-,) + mod) % mod;
ans = (ans - calc(,) + mod) % mod;
ans = (ans - calc(,-) + mod) % mod;
printf("%d\n",ans);
return ;
}

P3713 [BJOI2017]机动训练的更多相关文章

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

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

  2. BJOI2017 机动训练

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

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

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

  4. bzoj 4859 [BeiJing2017]机动训练

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=4859 题解 和管道取珠类似 首先把平方转化成两条路径经过的图案相同的方案数 对于一条路径 方 ...

  5. 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题) ...

  6. NOI Online #2 提高组 游记

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

  7. 一个小 Trick

    平方变两次 一个状态 \(S\) 有一个贡献,所有状态 \(S\) 组成集合 \(U\) . 然后我们要统计下面这个东西 \[ans=\sum_{S\in U}f^2(S) \] 然后我们就可以看作是 ...

  8. BJOI做题记录

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

  9. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

随机推荐

  1. LAMP中添加多虚拟主机

    在/etc/apache2/sites-available中默认有个default文件,其中的大致配置如下: <VirtualHost *:80> ServerAdmin xujie198 ...

  2. java使用ant.jar解压缩文件

    ant.jar下载地址http://ant.apache.org/bindownload.cgi 压缩文件代码: import org.apache.tools.ant.Project; import ...

  3. Poj 2187 旋转卡壳

    Poj 2187 旋转卡壳求解 传送门 旋转卡壳,是利用凸包性质来求解凸包最长点对的线性算法,我们逐渐改变每一次方向,然后枚举出这个方向上的踵点对(最远点对),类似于用游标卡尺卡着凸包旋转一周,答案就 ...

  4. 集训第六周 古典概型 期望 D题 Discovering Gold 期望

    Description You are in a cave, a long cave! The cave can be represented by a 1 x N grid. Each cell o ...

  5. Git和SVN共存的方法

    刚工作的时候都是用的cvs和svn,对git不熟悉,随着工作的需要,打分支和版本管理的需要,熟悉起来了git,这一用不可收拾,比svn远远好用,尤其是版本分支管理上,切换分支的方便性,现在这家公司还是 ...

  6. spark streaming基于Kafka的开发

    spark streaming使用Kafka数据源进行数据处理,本文侧重讲述实践使用. 一.基于receiver的方式 在使用receiver的时候,如果receiver和partition分配不当, ...

  7. 【状压+状态转移】A Famous Airport Managere

    https://www.bnuoj.com/v3/problem_show.php?pid=25653 [题意] 给定一个3*3的九宫格,模拟一个停机坪.第一个格子一定是'*',代表take off ...

  8. Bzoj3038 上帝造题的七分钟2 线段树

    Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1135  Solved: 509 Description XLk觉得<上帝造题的七分钟>不太 ...

  9. [NOIP2004] 提高组 洛谷P1091 合唱队形

    题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...

  10. msp430入门学习12

    msp430的定时器--Timer_A(定时器A) msp430入门学习