题目描述

农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记。比如说:

ABCD
BXZX
CDXB
WCBA

某一天,FJ从农场的左上角走到右下角,当然啦,每次他只能往右或者往下走一格。FJ把他走过的路径记录下来。现在,请你把他统计一下,所有路径中,回文串的数量(从前往后读和从后往前读一模一样的字符串称为回文串)。

输入输出格式

输入格式:

第一行包括一个整数N,表示农场的大小,接下来输入一个N*N的字母矩阵。

输出格式:

Please output the number of distinct palindromic routes Bessie can take,

modulo 1,000,000,007.

输出一个整数,表示回文串的数量。

输入输出样例

输入样例#1:

4
ABCD
BXZX
CDXB
WCBA
输出样例#1:

12
题解:动态规划
设f[i][j][k]为起点开始竖方向向下走到i,横向走到j,从终点向上走到k,可知l=i+j-k
f[i][j][k]->f[i+1][j][k]&f[i][j+1][k]&f[i+1][j][k+1]&f[i][j+1][k+1](颜色相同)
最后答案就是i+j=n时的最大值
时空间复杂度都是O(n^3)但还有优化
可以把第一维换成步数,f[i][j][k]表示走i步,向下到i,向上到k
f[i][j][k]->f[i+1][j+1][k]&f[i+1][j+1][k+1]&f[i+1][j][k+1]&f[i+1][j][k]
用滚动数组消去一个n
此题巨坑,时间卡的紧,多谢YZD大佬指点才过
要点:若f[now][j][k]=0就不转移 还有一个超级玄学优化,将滚动数组的第一位放到第三维,每次开始前不清空f[][][nxt],改为在i<n时,转移后将
f[][][now]清空。比原来快1000ms

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long lol;
int Mod=;
lol f[][][];
int now,nxt,n,m;
lol ans;
char a[][];
void get(int i)
{
int x=;
char ch=getchar();
while (ch<'A'||ch>'Z') ch=getchar();
while (ch>='A'&&ch<='Z')
{
x++;
a[i][x]=ch;
ch=getchar();
}
}
int main()
{
register int i,j,k;
//freopen("b.in","r",stdin);
//freopen("b.out","w",stdout);
cin>>n;
m=n;
for (i=; i<=n; i++)
{
get(i);
}
if (a[][]!=a[n][m])
{
cout<<<<endl;
return ;
}
f[][n][]=;
now=;
nxt=;
for (i=; i<=n; i++)
{
swap(now,nxt);
for (j=; j<=i; j++)
{int b=n-i+;
for (k=n; k>=b; k--)
if(f[j][k][now])
{
int y1=i-j+,y2=m-i+n-k+;
//printf("%d %d %d %d %d\n",i,j,y1,k,y2);
f[j][k][now]%=Mod;
if (j+<=n&&k->=&&a[j+][y1]==a[k-][y2])
f[j+][k-][nxt]+=f[j][k][now]; if (j+<=n&&y2->=&&a[j+][y1]==a[k][y2-])
f[j+][k][nxt]+=f[j][k][now]; if (y1+<=m&&k->=&&a[j][y1+]==a[k-][y2])
f[j][k-][nxt]+=f[j][k][now]; if (y1+<=m&&y2->=&&a[j][y1+]==a[k][y2-])
f[j][k][nxt]+=f[j][k][now];
if (i<n)
f[j][k][now]=;
}
}
}
for (i=; i<=n; i++)
ans=(ans+f[i][i][now])%Mod;
cout<<ans%Mod;
}

 

[USACO15OPEN]回文的路径Palindromic Paths 2.0版的更多相关文章

  1. [USACO15OPEN]回文的路径Palindromic Paths

    [USACO15OPEN]回文的路径Palindromic Paths 题目描述 Farmer John's farm is in the shape of an N \times NN×N grid ...

  2. 题解 P3126 【[USACO15OPEN]回文的路径Palindromic Paths】

    P3126 [USACO15OPEN]回文的路径Palindromic Paths 看到这题题解不多,蒟蒻便想更加通俗易懂地分享一点自己的心得,欢迎大佬批评指正^_^ 像这种棋盘形的两边同时做的dp还 ...

  3. [译+改]最长回文子串(Longest Palindromic Substring) Part II

    [译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...

  4. [译]最长回文子串(Longest Palindromic Substring) Part I

    [译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...

  5. 洛谷P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有 ...

  6. 领扣-5 最长回文子串 Longest Palindromic Substring MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. USACO 回文的路径

    传送门 这道题和传纸条在某些方面上非常的相似.不过这道题因为我们要求回文的路径,所以我们可以从中间一条大对角线出发去向两边同时进行DP. 这里就有了些小小的问题.在传纸条中,两个路径一定是同时处在同一 ...

  8. 洛谷 P1206 [USACO1.2]回文平方数 Palindromic Squares

    P1206 [USACO1.2]回文平方数 Palindromic Squares 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2< ...

  9. Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings)

    Leetcode之动态规划(DP)专题-647. 回文子串(Palindromic Substrings) 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子 ...

随机推荐

  1. 2018上C语言程序设计(高级)博客作业样例

    要求一(20分) 完成PTA中题目集名为<usth-C语言高级-第1次作业>中的所有题目. 要求二 PTA作业的总结(20分+30分) 将PTA第1次作业作业中以下2道题的解题思路按照规定 ...

  2. Twisted 延迟调用

    延迟(defer)是twisted框架中实现异步的编程体系,使程序设计可以采用事件驱动的机制 1.基本使用 defer可以看作一个管理回调函数的对象,可以向该对象添加需要的回调函数同时也可以指定该组函 ...

  3. 如何使用ILAsm与ILDasm修改.Net exe(dll)文件

    一.背景 最近项目组新上项目,交付的时间比较急迫,原本好的分支管理习惯没有遵守好,于是出现下面状况: 多个小伙伴在不同的分支上开发. 原本QA环境也存在一个阻碍性的bug A 一位同事在QA环境发布了 ...

  4. CentOS搭建Git服务器及权限管理

    声明:本教程,仅作为配置的记录,细节不展开,需要您有一点linux的命令基础,仅作为配置参考. 1. 系统环境 系统: Linux:CentOS 7.2 64位 由于CentOS已经内置了OpenSS ...

  5. Vue.js和jQuery混合使用的一点注意事项

    首先,Vue 的官方是不建议直接操作 DOM 的,其优势在于视图和数据的双向绑定,而且所有DOM操作都可以用Vue实现,反而使用jQuery来操作DOM的话,会造成不必要的麻烦,DOM未渲染完成之前事 ...

  6. 深度爬取之rules

    深度爬取之rules CrawlSpider使用rules来决定爬虫的爬取规则,并将匹配后的url请求提交给引擎.所以在正常情况下,CrawlSpider不需要单独手动返回请求了. 在rules中包含 ...

  7. Python内置函数(3)——max

    英文文档: max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an i ...

  8. PHP / Laravel 月刊 #23

    最新资讯 Laravel 5.6 中文文档翻译完成,译者 60 人,耗时 10 天 Summer Dingo API 中文文档翻译召集[已完成] Summer 我最喜欢 Laravel 5.6 的三个 ...

  9. ActiveMQ学习系列(一)

    一.JMS规范 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消 ...

  10. AES(高级加密)

    AES(高级加密) #3.6安装 pip3 install pycryptodome #mac pip3 install pycrypto a. 事例: ####################### ...