题目描述

农夫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. Go语言的数组

    在 Go 语言里,数组是一个长度固定的数据类型,用于存储一段具有相同的类型的元素的连续块.数组存储的类型可以是内置类型,如整型或者字符串,也可以是某种结构类型. 1 数组特性 (1)内存是连续分配,C ...

  2. 2017-2018-1 20155306 mypwd的实现

    2017-2018-1 20155306 mypwd的实现 一.pwd的使用 功能: Linux中用 pwd 命令来查看"当前工作目录"的完整路径. 命令格式:pwd [选项] 命 ...

  3. 结合Socket实现DDoS攻击

    一.实验说明 1. 实验介绍 通过上一节实验的SYN泛洪攻击结合Socket实现DDoS攻击. 2. 开发环境 Ubuntu Linux Python 3.x版本 3. 知识点 本次实验将涉及以下知识 ...

  4. mongodb 复制(副本集)

    复制(副本集) 什么是复制 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性 复制还允许从硬件故障和服务中断中恢复数据 为什么要复制 数据备份 数据灾 ...

  5. 201421123042 《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread 1.1 BallR ...

  6. django的FBV和CBV

    title: python djano CBV FBV tags: python, djano, CBV, FBV grammar_cjkRuby: true --- python django的fu ...

  7. java中final 关键字的作用

    final 关键字的作用 java中的final关键字可以用来声明成员变量.本地变量.类.方法,并且经常和static一起使用声明常量. final关键字的含义: final在Java中是一个保留的关 ...

  8. ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区

    (一)问题 今天在使用Pl/sql developer查看表空间大小的时候,报错误:ORA-00379 缓冲池 DEFAULT 中无法提供 32K 块大小的空闲缓冲区,具体如下图: SQL> s ...

  9. ELK学习总结(2-5)elk的版本控制

    ----------------------------------------------------------------- 1.悲观锁和乐观锁 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据 ...

  10. LDAP是什么

    LDAP的英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP.LDAP目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的 ...