[USACO15OPEN]回文的路径Palindromic Paths

题目描述

农夫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-kf[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,向上到kf[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就不转移
 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<iostream>
 5 using namespace std;
 6 typedef long long lol;
 7 int Mod=1000000007;
 8 lol f[2][501][501];
 9 int now,nxt,n,m;
10 lol ans;
11 char a[501][501];
12 void get(int i)
13 {
14     int x=0;
15     char ch=getchar();
16     while (ch<‘A‘||ch>‘Z‘) ch=getchar();
17     while (ch>=‘A‘&&ch<=‘Z‘)
18     {
19         x++;
20         a[i][x]=ch;
21         ch=getchar();
22     }
23 }
24 int main()
25 {
26     register int i,j,k;
27     //freopen("b.in","r",stdin);
28     //freopen("b.out","w",stdout);
29     cin>>n;
30     m=n;
31     for (i=1; i<=n; i++)
32     {
33         get(i);
34     }
35     if (a[1][1]!=a[n][m])
36     {
37         cout<<0<<endl;
38         return 0;
39     }
40     f[0][1][n]=1;
41     now=1;
42     nxt=0;
43     for (i=1; i<=n; i++)
44     {
45         swap(now,nxt);
46         memset(f[nxt],0,sizeof(f[nxt]));
47         for (j=1; j<=i; j++)
48         {int b=n-i+1;
49             for (k=n; k>=b; k--)
50             if(f[now][j][k])
51             {
52                 int y1=i-j+1,y2=m-i+n-k+1;
53                 //printf("%d %d %d %d %d\n",i,x1,y1,x2,y2);
54                 f[now][j][k]%=Mod;
55                 if (j+1<=n&&k-1>=1&&a[j+1][y1]==a[k-1][y2])
56                     f[nxt][j+1][k-1]+=f[now][j][k];
57
58                 if (j+1<=n&&y2-1>=1&&a[j+1][y1]==a[k][y2-1])
59                     f[nxt][j+1][k]+=f[now][j][k];
60
61                 if (y1+1<=m&&k-1>=1&&a[j][y1+1]==a[k-1][y2])
62                     f[nxt][j][k-1]+=f[now][j][k];
63
64                 if (y1+1<=m&&y2-1>=1&&a[j][y1+1]==a[k][y2-1])
65                     f[nxt][j][k]+=f[now][j][k];
66             }
67         }
68     }
69     for (i=1; i<=n; i++)
70         ans=(ans+f[now][i][i])%Mod;
71     cout<<ans%Mod;
72 }
时间: 2024-10-19 11:44:38

[USACO15OPEN]回文的路径Palindromic Paths的相关文章

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

[译+改]最长回文子串(Longest Palindromic Substring) Part II 问题:给定字符串S,求S中的最长回文子串. 在上一篇,我们给出了4种算法,其中包括一个O(N2)时间O(1)空间的算法(中心检测法),已经很不错了.本篇将讨论一个O(N)时间O(N)空间的算法,即著名的Manacher算法,并详细说明其时间复杂度为何是O(N). 提示 +BIT祝威+悄悄在此留下版了个权的信息说: 先想想有什么办法能改进中心检测法. 考虑一下最坏的情况.★ 最坏的情况就是各个回文

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

P1206 [USACO1.2]回文平方数 Palindromic Squares 271通过 501提交 题目提供者该用户不存在 标签USACO 难度普及- 提交  讨论  题解 最新讨论 暂时没有讨论 题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数.用’A’,’B’……表示10,11等等 输入输出格式 输入格式: 共

【中等】5-最长回文子串 Longest Palindromic Substring

题目 Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000. 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. Example1 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. Example2 输

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

题目描述 回文数是指从左向右念和从右向左念都一样的数.如12321就是一个典型的回文数. 给定一个进制B(2<=B<=20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数.用'A','B'--表示10,11等等 输入输出格式 输入格式: 共一行,一个单独的整数B(B用十进制表示). 输出格式: 每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数. 输入输出样例 输入样例#1: 10 输出样例#1: 1 1 2 4 3

最长回文子串(Longest Palindromic Substring)-DP问题

问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串. 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1] 当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false. 动态规划的进行是按照字符串的长度从1 到 n推进的. DP算法实现: 1 packa

LeetCode 5. 最长回文子串 Longest Palindromic Substring

题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb"  解法一 遍历字符串,以每个字母为中心,向两边扩散查找,记录当前最长的回文子串的长度和起始位置.结尾位置.时间复杂度O(n^2) 注意: ①当剩下的字符串长度小于当前m

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

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串. 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "b", "c". 示例 2: 输入: "aaa" 输出: 6 说明: 6个回文子串: "a", "a", "a", &quo

luogu 3126 回文的路径

https://www.luogu.org/problem/show?pid=3126 考虑dp,从两头走到中间. f[i][j][k][l]表示从左上角走到(i,j),从右下角走到(k,l),路径长度相等,所经过路径相同的方案数. 方程不再赘述. 考虑步数要相同,所以只要枚举步数和行就好. f[i][j][k]表示第一个点在第j行,第2个点在第k行,走i步的方案数. 所以得出方程f[i][j][k]=(f[i-1][j-1][k]+f[i-1][j][k+1]+f[i-1][j-1][k+1]

转载:LeetCode:5Longest Palindromic Substring 最长回文子串

本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 求字符串的最长回文子串 算法1:暴