HDU 5617 多维dp降维问题,回文串匹配
来源:互联网 发布:备案域名可以不注销吗 编辑:程序博客网 时间:2024/06/01 10:22
给你一个n*n的矩阵。 求从(1,1)走到(n,n)所组成的回文串个数。只可以向右或者向下走。
思路:
1.此题的“序” 是这个二维坐标。
2.影响决策的因素是前后字符串是否比配。
3.状态及其考虑的方案:
因为是回文串问题,所以要考虑从首尾两个位置进行枚举看看相对应的位置是否相等,同时再记录他们的对应位置的相匹配的数量。
可以设从起点(1,1)和终点(n,n)同时出发,计算分别到达(x1,y1)和(x2,y2)的位置时 相匹配的数量,此时我们可以用dp[x1][y1][x2][y2]记录。
当(x1,y1)和(x2,y2)位置的字符相等时,
4状态转移方程:只需要计算dp[x1][y1][x2][y2]=dp[x1-1][y1][x2+1][y2]+dp[x1-1][y1][x2][y2+1]+dp[x1][y1-1][x2+1][y2]+dp[x1][y1-1][x2][y2+1].
但此题,n=500会超内存,所以我们就想着去降低维度,因为回文串前后对应的长度是相等的所以我们可以表示为dp[ i ][ x1 ][ x2 ]。用 i 表示已经走的步数,而此时对应的y1=i-x1+2; y2=2*n-i-x2; 但是此时的为 500*500*500还需要降维 ,此时就用到了滚动数组。因为当前状态只与前一个状态有关。
注意:
写滚动数组一定要注意,初始的状态的01表示,与结束状态的01表示,状态只有前一次的状态有关,所以对于当前状态一定要记得初始化,防止状态i-2对
状态i造成影响。
<pre name="code" class="cpp">/****************************************/#include <bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int N =510;const int mod =5201314;char s[N][N];int dp[2][N][N];int main(){ int t,n; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s[i]+1); } memset(dp,0,sizeof(dp)); if(s[1][1]==s[n][n]) dp[0][1][n]=1; ///初始状态 int p=1; ///滚动数组的下一状态 for(int i=1;i<n;i++){ ///是n-1步 for(int x1=1;x1<=n;x1++){ for(int x2=n;x2>=1;x2--){ dp[p][x1][x2]=0; ///初始化***** int y1=i-x1+2; int y2=2*n-i-x2; if(s[x1][y1]!=s[x2][y2])continue; dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1-1][x2])%mod; dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1-1][x2+1])%mod; dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1][x2+1])%mod; dp[p][x1][x2]=(dp[p][x1][x2]+dp[!p][x1][x2])%mod; } } p=!p; } int sum=0; for(int i=1;i<=n;i++){ sum=(sum+dp[!p][i][i])%mod; } printf("%d\n",sum); } return 0;}
0 0
- HDU 5617 多维dp降维问题,回文串匹配
- DP-回文字符串匹配
- HDU 4632 回文串(区间dp)
- hdu 4632 回文DP
- Hdu 6157 The Karting 多维DP
- DP问题 制造回文字符串
- 匹配问题 dp预处理
- poj3280(回文串,DP)
- DP与回文串
- dp 回文串
- DP问题--求取一个字符串回文串的多少
- dp问题 添加最少的字符构成回文串
- hdu-4632-Palindrome subsequence DP&回文字串
- hdu 1513 Palindrome(dp 回文子序列)
- hdu 6156 回文数 数位dp
- 匹配最长的回文串
- 正则表达式匹配回文串
- HDU 3652 记忆化搜索加 多维数位dp 模板
- leetcode 试题总结<5>
- Android 自定义属性详解
- OC 06内存管理
- 程序员写的情书
- I/O篇(1)——java.io.File类
- HDU 5617 多维dp降维问题,回文串匹配
- Ganglia在CentOS7_x86_64上的yum安装与配置
- Redis Memcache SSDB比较
- remap()函数
- 超全!整理常用的iOS第三方资源
- 多线程——同步嵌套造成死锁问题
- 【漫画】Java正在死去?
- 在win7上的eclipse向hadoop提交作业异常-权限/设置调度器
- 10个最受欢迎的免费WordPress主题