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

news/2024/7/5 13:57:42

题解

遇见平方和就转有序对呗

dp类似从很多点出发每次走一步的转移方式

然后我too naive的,枚举路径长度来决定更新次数,愉快TLE

改成记搜就过了

代码

#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define MAXN 100005
#define mo 994711
//#define ivorysi
using namespace std;
typedef long long int64;
typedef long double db;
typedef unsigned int u32;
template<class T>
void read(T &res) {
    res = 0;char c = getchar();T f = 1;
    while(c < '0' || c > '9') {
    if(c == '-') f = -1;
    c = getchar();
    }
    while(c >= '0' && c <= '9') {
    res = res * 10 + c - '0';
    c = getchar();
    }
    res *= f;
}
template<class T>
void out(T x) {
    if(x < 0) {putchar('-');x = -x;}
    if(x >= 10) out(x / 10);
    putchar('0' + x % 10);
}
const int MOD = 1000000009;
int N,M,dp[35][35][35][35],cur,cnt;
char s[35][35];
int dx[2][5],dy[2][5];
int X[3] = {0,1,1};
int Y[3] = {1,0,1};
int inc(int a,int b) {
    return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
    return 1LL * a * b % MOD;
}
void update(int &x,int y) {
    x = inc(x,y);
}
inline bool check(int on,int x,int y,int d,int c) {
    if(X[c] && (!dx[on][d])) return false;
    if(Y[c] && (!dy[on][d])) return false;
    int tx = x + X[c] * dx[on][d];
    int ty = y + Y[c] * dy[on][d];
    if(tx < 1 || tx > N) return false;
    if(ty < 1 || ty > M) return false;
    return true;
}
int DP(int x1,int y1,int x2,int y2,int l,int v) {
    if(dp[x1][y1][x2][y2] != -1) return dp[x1][y1][x2][y2];
    if(s[x1][y1] != s[x2][y2]) return 0;
    dp[x1][y1][x2][y2] = 1;
    for(int a = 0 ; a <= 2 ; ++a) {
    for(int b = 0 ; b <= 2 ; ++b) {
        if(check(0,x1,y1,l,a) && check(1,x2,y2,v,b)) {
        int tx1 = x1 + X[a] * dx[0][l];
        int ty1 = y1 + Y[a] * dy[0][l];
        int tx2 = x2 + X[b] * dx[1][v];
        int ty2 = y2 + Y[b] * dy[1][v];
        update(dp[x1][y1][x2][y2],DP(tx1,ty1,tx2,ty2,l,v));
        }
    }
    }
    return dp[x1][y1][x2][y2];
}
int Calc(int Len) {
    cur = 0;
    int res = 0;
    
    for(int l = 0 ; l <= 3 ; ++l) {
    for(int v = 0 ; v <= 3 ; ++v) {
        memset(dp,-1,sizeof(dp));
        for(int i = 1 ; i <= N ; ++i) {
        for(int j = 1 ; j <= M ; ++j) {
            for(int k = 1 ; k <= N ; ++k) {
            for(int h = 1 ; h <= M ; ++h) {
                if(s[i][j] != s[k][h]) continue;
                update(res,inc(DP(i,j,k,h,l,v),MOD - 1));
           
            }
            }
        }
        }
    }
    }
    return res;
}
void Solve() {
    read(N);read(M);
    int ans = 0;
    for(int i = 1 ; i <= N ; ++i) scanf("%s",s[i] + 1);
    dx[0][0] = dx[1][0] = 1;dx[0][1] = dx[1][1] = 1;dx[0][2] = dx[1][2] = -1;dx[0][3] = dx[1][3] = -1;
    dy[0][0] = dy[1][0] = 1;dy[0][1] = dy[1][1] = -1;dy[0][2] = dy[1][2] = 1;dy[0][3] = dy[1][3] = -1;
    update(ans,Calc(N + M));
    dx[0][0] = 1;dx[0][1] = -1;dx[0][2] = 0;dx[0][3] = 0;
    dy[0][0] = 0;dy[0][1] = 0;dy[0][2] = 1;dy[0][3] = -1;
    update(ans,MOD - Calc(max(N,M)));
    for(int i = 0 ; i <= 3 ; ++i) {
    swap(dx[0][i],dx[1][i]);
    swap(dy[0][i],dy[1][i]);
    }
    update(ans,MOD - Calc(max(N,M)));
    memcpy(dx[0],dx[1],sizeof(dx[1]));
    memcpy(dy[0],dy[1],sizeof(dy[1]));
    update(ans,Calc(max(N,M)));
    out(ans);enter;
}
int main() {
#ifdef ivorysi
    freopen("f1.in","r",stdin);
#endif
    Solve();
    return 0;
}

转载于:https://www.cnblogs.com/ivorysi/p/9674755.html


http://www.niftyadmin.cn/n/4822160.html

相关文章

爬虫框架Scrapy入门——爬取acg12某页面

1.安装1.1自行安装python3环境1.2ide使用pycharm1.3安装scrapy框架2.入门案例2.1新建项目工程2.2配置settings文件2.3新建爬虫app新建app将start_urls的值修改为需要爬取的第一个url修改parse()方法然后运行一下看看&#xff0c;在mySpider目录下执行&#xff1a;1.安装 1.1自行…

CCNA-使用CLI方式配置设备命令

一&#xff1a;设备不同模式 1、 用户模式&#xff08;简单的查看&#xff09;&#xff1a; Switch> ---进入用户模式 设备名称模式 2、特权模式&#xff08;进行所有的查看以及简单的配置&#xff09;&#xff1a; sw1>enable …

Jmeter-正则表达式提取器获取token-小实例

步骤一&#xff1a;在需要获取token的接口上&#xff0c;添加正则表达式提取器 说明&#xff1a; (1) Apply to:应用范围 Main sample and sub-samples:匹配范围包括当前父取样器并覆盖至子取样器 Main sample only:匹配范围为当前父取样器 Sub-samples only:仅匹配子取样器 JM…

CCNA-路由器之静态路由

一、路由器的作用&#xff1a; 1、用于不同网络间的互联 2、为它所承载的数据做路径的选择&#xff08;选路&#xff09; 当数据包进入路由器后&#xff0c;路由器将基于数据包中的目标ip地址&#xff0c;查看本地的路由表&#xff1b;查询后若存在记录将无条件按照记录转发…

Codeforces Round #509 (Div. 2) E. Tree Reconstruction(构造)

题目链接&#xff1a;http://codeforces.com/contest/1041/problem/E 题意&#xff1a;给出n - 1对pair&#xff0c;构造一颗树&#xff0c;使得断开其中一条边&#xff0c;树两边的最大值为 a 和 b 。 题解&#xff1a;显示最大值出现的次数为n - 1&#xff0c;且i点出现的次数…

CCNA-ARP(地址解析协议) RARP(反向地址转换协议) 无故(免费)ARP

一、ARP&#xff08;地址解析协议&#xff09; 1、基本概念 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。 主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主…

CCNA-静态路由之扩展配置

一、环回接口 路由器上用来测试TCP/IP协议栈能否正常封装与解封装数据 1、PC 默认存在&#xff0c;127.0.0.1 //本地环回地址&#xff0c;用来测试本机TCP/IP协议栈能否正常工作 2、路由器 路由器也存在环回接口&#xff0c;为了测试路由器的TCP/IP协议栈能否正常工作&…

求两个数之间的质数 -----------基于for循环 算法思想

前端代码&#xff1a; <% Page Language"C#" AutoEventWireup"true" CodeFile"Default.aspx.cs" Inherits"_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org…