[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)
View Code
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
相关文章推荐
- jvisualvm远程监控Tomcat
- 关于安装tomcat启动的一些问题
- MapReduce程序的3种集群提交运行模式详解---基于Windows与Linux两种开发环境
- shell脚本:脚本分析汇总ping日志文件
- Hadoop 2.6.4单节点集群配置
- zabbix
- shell脚本:mysql全备与binlog增量备份
- shell脚本:nginx访问日志切割与打包上传
- maven依赖关系中Scope的作用
- new Linux git setting
- shell脚本:日志切割与上传
- shell脚本:检查ftp日志存储服务器上的日志是否正常上传
- centos7.1下 Docker环境搭建
- Hadoop2.6.0伪分布环境搭建
- ReturnType operator "" _suffix(Type t){Method's Body}
- Linux进程通信
- ubuntu14.04下hadoop2.6.0安装
- CentOS6.5 安装CPAN,从而安装perl的各种模块
- snoopy
- HDU 4016 Magic Bitwise And Operation(dfs+剪枝)