博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1503 猪和回文(DP)
阅读量:6150 次
发布时间:2019-06-21

本文共 2321 字,大约阅读时间需要 7 分钟。

题目来源: 
基准时间限制:2 秒 空间限制:131072 KB 分值: 40 

一只猪走进了一个森林。很凑巧的是,这个森林的形状是长方形的,有n行,m列组成。我们把这个长方形的行从上到下标记为1到n,列从左到右标记为1到m。处于第r行第c列的格子用(r,c)表示。

刚开始的时候猪站在(1,1),他的目标是走到(n,m)。由于猪回家心切,他在(r,c)的时候,只会往(r+1,c)或(r,c+1)走。他不能走出这个森林。

这只猪所在的森林是一个非同寻常的森林。有一些格子看起来非常相似,而有一些相差非常巨大。猪在行走的过程中喜欢拍下他经过的每一个格子的照片。一条路径被认为是漂亮的当且仅当拍下来的照片序列顺着看和反着看是一样的。也就是说,猪经过的路径要构成一个回文。

数一数从(1,1)到(n,m)有多少条漂亮路径。答案可能非常巨大,请输出对 109+7 取余后的结果。

样例解释:有三种可能

  

Input
单组测试数据。第一行有两个整数 n,m (1≤n,m≤500),表示森林的长和宽。接下来有n行,每行有m个小写字母,表示每一个格子的类型。同一种类型用同一个字母表示,不同的类型用不同的字母表示。
Output
输出答案占一行。
Input示例
3 4aaabbaaaabba
Output示例
3 //没什么好办法,暴力是不可能的,想贡献也想不出,动态规划,好像有点感觉,但是想不清楚,唉, 设 dp[i][j][k][z] 为,从(1,1) 走右和下走到 (i,j) ,从(n,m)走左和上到(k,z) ,并且路径上的字符完全相同的种数 容易得到:   dp[i][j][k][z] += dp[i-1][j][k+1][z];   dp[i][j][k][z] += dp[i-1][j][k][z+1];   dp[i][j][k][z] += dp[i][j-1][k+1][z];   dp[i][j][k][z] += dp[i][j-1][k][z+1]; 可以发现的是,只需要 dp[i] 和 dp[i-1] ,所以滚动数组优化一维 如果 i j k 知道了的话 z 可以算出,所以再去掉一维,就完美解决这个问题了
1 #include 
2 using namespace std; 3 #define LL long long 4 #define MOD 1000000007 5 #define MX 505 6 7 int n, m; 8 char dat[MX][MX]; 9 LL dp[2][MX][MX];10 11 int check(int x,int y,int k,int z)12 {13 if (x==k&&y==z) return 1;14 if (x+1==k&&y==z) return 1;15 if (x==k&&y+1==z) return 1;16 return 0;17 }18 19 int main()20 {21 scanf("%d%d",&n,&m);22 for (int i=1;i<=n;i++)23 {24 scanf("%s",dat[i]+1);25 }26 if (dat[1][1]==dat[n][m])27 dp[1][1][n]=1;28 LL ans = 0;29 for (int i=1;i<=n;i++)30 {31 for (int j=1;(i+j-1)<=(n+m)/2;j++)32 {33 for (int k=n;n+m+2-i-j-k<=m;k--)34 {35 int z = n+m+2-i-j-k;36 if (dat[i][j]==dat[k][z])37 {38 dp[i%2][j][k] += dp[(i-1)%2][j][k+1];39 dp[i%2][j][k] += dp[(i-1)%2][j][k];40 dp[i%2][j][k] += dp[i%2][j-1][k+1];41 dp[i%2][j][k] += dp[i%2][j-1][k];42 dp[i%2][j][k] %= MOD;43 if (check(i,j,k,z))44 ans = (ans+dp[i%2][j][k])%MOD;45 }46 }47 }48 memset(dp[(i-1)%2],0,sizeof(dp[(i-1)%2]));49 }50 printf("%lld\n",ans);51 return 0;52 }
View Code
 

 

 
 

 

转载于:https://www.cnblogs.com/haoabcd2010/p/7603452.html

你可能感兴趣的文章
Android扩展 - 拍照篇(Camera)
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
IIS7如何显示详细错误信息
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
登记申请汇总
查看>>
Android Jni调用浅述
查看>>
CodeCombat森林关卡Python代码
查看>>
第一个应用程序HelloWorld
查看>>
(二)Spring Boot 起步入门(翻译自Spring Boot官方教程文档)1.5.9.RELEASE
查看>>
Java并发编程73道面试题及答案
查看>>
企业级负载平衡简介(转)
查看>>
ICCV2017 论文浏览记录
查看>>
科技巨头的交通争夺战
查看>>
当中兴安卓手机遇上农行音频通用K宝 -- 卡在“正在通讯”,一直加载中
查看>>
Shell基础之-正则表达式
查看>>