【USACO 2015 Open Gold】Palindromic Paths 动态规划

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/45222487");
}

题意:

从 n×n 的矩阵 左上角走到右下角会有一个长度 n+n+1 的字符串,问有多少种走法使得路径字符串为回文?

题解:

f(i,j,k,l) 表示起点横着走 i 步,竖着走 j 步,终点竖着走 k 步,横着走 l 步时的回文方案数。

然后跑动态规划时 f(i,j,k,l) 可以更新

f(i+1,j,k+1,l)、f(i+1,j,k,l+1)、f(i,j+1,k+1,l)、f(i,j+1,k,l+1)

跑动态规划的顺序是 (i+j) 从小到大。

然后时间复杂度是 O(n4),但是我们发现 (i+j==k+l) ,所以可以少枚举一个 l ,然后时空复杂度就变成 O(n3) 了,但是这道题64MB,会MLE,然后我们发现 (i+j) 满足滚动数组的性质,空间复杂度变成了 O(n2) 。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 505
#define mod 1000000007
using namespace std;
int n,f[2][N][N];
char s[N][N];
#define add(a,b) (a=(a+b)%mod)
int main()
{
    int i,j,k,l;
    int a,b,x,y;

    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%s",s[i]+1);
    if(s[1][1]!=s[n][n])
    {
        puts("0");
        return 0;
    }
    int now=1,last=0;
    f[now][0][0]=1;
    for(int h=0;h<n;h++)
    {
        now^=1,last^=1;
        memset(f[now],0,sizeof f[now]);
        for(i=0;i<=h;i++)
        {
            j=h-i,a=1+i,b=1+j;
            for(k=0;k<=h;k++)
            {
                l=h-k,x=n-l,y=n-k;
                if(s[a+1][b]==s[x-1][y])add(f[now][i+1][ k ],f[last][i][k]);
                if(s[a+1][b]==s[x][y-1])add(f[now][i+1][k+1],f[last][i][k]);
                if(s[a][b+1]==s[x-1][y])add(f[now][ i ][ k ],f[last][i][k]);
                if(s[a][b+1]==s[x][y-1])add(f[now][ i ][k+1],f[last][i][k]);
            }
        }
    }
    int ans=0;
    for(i=0;i<n;i++)add(ans,f[last][i][i]);
    cout<<ans<<endl;
    return 0;
}
时间: 2024-07-29 05:23:45

【USACO 2015 Open Gold】Palindromic Paths 动态规划的相关文章

TOJ 5020: Palindromic Paths

5020: Palindromic Paths  Time Limit(Common/Java):10000MS/30000MS     Memory Limit:65536KByteTotal Submit: 8            Accepted:4 Description Given an N×N grid of fields (1≤N≤500), each labeled with a letter in the alphabet. For example: ABCD BXZXCDX

USACO 2015 February Contest Gold T2: Censoring

题目大意 FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过10^5的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t1...tN.他希望从S中删除这些单词. FJ每次在S中找到最早出现的列表中的单词(最早出现指该单词的开始位置最小),然后从S中删除这个单词.他重复这个操作直到S中没有列表里的单词为止.注意删除一个单词后可能会导致S中出现另一个列表中的单词 FJ注意到列表中的单词不会出现一个单词是另一个单词子串的情况,这意味着每个列表中的单词在S中出现的开始位置是互不相同的

[USACO15OPEN]回文的路径Palindromic Paths

题目描述 农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记.比如说: ABCD BXZX CDXB WCBA 某一天,FJ从农场的左上角走到右下角,当然啦,每次他只能往右或者往下走一格.FJ把他走过的路径记录下来.现在,请你把他统计一下,所有路径中,回文串的数量(从前往后读和从后往前读一模一样的字符串称为回文串). 输入输出格式 输入格式: 第一行包括一个整数N,表示农场的大小,接下来输入一个N*N的字母矩阵. 输出格式: Please

[USACO 2012 Mar Gold] Large Banner

传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=127 又是一道这种题目,遇到一次跪一次,这次终于硬着头皮看懂了题解,但是谢了代码之后还是wa了3个点(共20个),实在是找不出哪里错了,略烦... 题解真的不想写了,贴个链接叭... http://blog.csdn.net/kanosword/article/details/52585972 这道题比较冷门,官方题解看得不是太懂,上面那个链接讲得比较清楚.

bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2581 这题我一看就知道自己不会了,只想了个O(2^n * 2 ^ n)即O(2 ^ 2n)的大暴力,也懒得打了,果断看solution. 看了之后惊呆了,看到了一种从未见过,闻所未闻的树叫做And-Or Tree,百度了一下,并没有官方中文翻译,姑且叫他"

【BZOJ1229】【USACO 2008 Nov Gold】 4.Toys sadstory 三分+贪心

sad story:我们自己oj的数据貌似有点问题.标程WA了5% 题解: 复制去Google翻译翻译结果 首先引一下VFK神犇的证明来证明一下这道题是三分.. { 我来告诉你世界的真相 = = 因为这题能最小费用最大流 每次最短路长度不降 所以是单峰的 最短路长度就是差分值.. 所以一阶导不降.. 是不是简单粗暴 你要证函数是单峰的. 当然是证斜率什么的 } 三分完初始买了多少个玩具,然后就是贪心. 首先我想说这个贪心真动规.虽然它真的是贪心. 首先先说一种错误的贪心. 就是从前往后扫,优先用

USACO 2011 Jan Gold 3. Roads and Planes

题意: 给出一个n个结点m条边有向图,可能有负权边: 但是存在负权边a->b则不会有某个路径可以从b到a: 求一个源点s到所有点的最短路(无解输出"NO PATH"): n<=25000,m<=150000: 题解: 高高兴兴的写了一发spfa,O(km)嘛: 然后就TLE了,这题丧心病狂的把spfa卡掉了: 这时候理所当然的想到了dij+heap,写到一半想起来不支持负权边: 所以这个不是一个简单的单源最短路问题: 题中有一个重要条件就是负权边不会回去: 我本以为只

USACO 2015 Meeting time BFS+最优剪枝

题目 题目描述 Bessie and her sister Elsie want to travel from the barn to their favorite field, such that they leave at exactly the same time from the barn, and also arrive at exactly the same time at their favorite field. The farm is a collection of N fie

【POJ3659】【USACO 2008 Jan Gold】 3.Cell Phone Network 树上最小支配集/贪心 两种做法

题意:求树上最小支配集 最小支配集:点集,即每个点可以"支配"到相邻点,求最少点数可以使所有点被支配. 图上的最小支配集是NP的,但是树上的可以DP做,是O(n)的. 暴力做就好了, f[i]表示此 点被选时的子树全支配的最小代价 g[i]表示其父亲节 点被选时的子树全支配的最小代价 h[i]表示其某子节 点被选时的子树全支配的最小代价 然后暴力转移. (v是子节点) f[x]=∑(min(f[v],min(g[v],h[v])))+1; g[x]=∑(min(f[v],h[v]));