您的位置:首页 > 运维架构

[bzoj4098] [Usaco2015 Open]Palindromic Paths

2016-07-05 21:06 309 查看
  DP。。

  f[i][j][k]表示左上结束节点是第i条副对角线上的第j个点,右下结束节点是第n*2-i条副对角线上的第k个点,构成回文的方案数。

  i那维滚动一下。时间复杂度O(n^3)空间复杂度O(n^2)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ui unsigned int
using namespace std;
const int modd=1e9+7;
ui f[2][505][505];
char mp[505][505],s[505][505];
int i,j,k,n,m;
int ans;

int ra;char rx;
inline int read(){
rx=getchar(),ra=0;
while(rx<'0'||rx>'9')rx=getchar();
while(rx>='0'&&rx<='9')ra*=10,ra+=rx-48,rx=getchar();return ra;
}

int main(){
n=read();
for(i=1;i<=n;i++)scanf("%s",s[i]+1);
if(s[1][1]!=s

){puts("0");return 0;}
for(i=1;i<=n+n-1;i++)
for(j=1;j<=min(i,n+n-i);j++)
if(i<=n)mp[i][j]=s[i-j+1][j];
else mp[i][j]=s[n-j+1][i+j-n];
bool now=1,pre=0;int nn=n+n;
f[0][1][1]=s[1][1]==s

;
for(i=2;i<=n;i++,swap(now,pre))
for(j=1;j<=i;j++)for(k=1;k<=i;k++)if(mp[i][j]==mp[nn-i][k])
f[now][j][k]=(f[pre][j-1][k-1]+f[pre][j-1][k]+f[pre][j][k-1]+f[pre][j][k])%modd;
else f[now][j][k]=0;
for(i=1;i<=n;i++)ans+=f[pre][i][i],ans-=ans>=modd?modd:0;
printf("%d\n",ans);
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: