[HDU4362] Palindrome subsequence (区间DP)
题目链接
题目大意
给你几个字符串 (1<len(s)<1000) ,要你求每个字符串的回文序列个数.对于10008取模.
Solution
区间DP。
比较典型的例题。
状态定义:
令 \(f[i][j]\) 表示 \(i\) 到 \(j\) 的回文序列个数,\(s\) 为给出的字符串.
状态转移:
- \(s[i]\neq s[j]\)
那么此时 \(f[i][j]\) 即为\(f[i][j-1]\),\(f[i+1][j]\)之和.
但由于 \(i+1->j-1\)的我们明显重复统计了,所以方程即为:
\]
2. $s[i]=s[j]$
此时考虑,对于 $i+1$ 到 $j-1$ 每一个回文序列,我们都可以把 $s[i]$和$s[j]$ 加在两边.同时还多了 $s[i],s[j]$ 这个序列.
所以此时方程即为:
$$f[i][j]=f[i+1][j]+f[i][j-1]+1$$
### Code
```cpp
#include
using namespace std;
const int maxn=1008;
const int mod=10007;
int f[maxn][maxn];
int n,t;
char s[maxn];
int main()
{
cin>>t;
for(int k=1;k<=t;k++)
{
scanf("%s",s);
n=strlen(s);
memset(f,0,sizeof(f));
for(int i=0;i<n;i++)
{
f[i][i]=1;
if(i<n-1)
if(s[i]s[i+1])
f[i][i+1]=3;
else f[i][i+1]=2;
}
for(int len=3;len<=n;len++)
for(int l=0;l<=n-len;l++)
{
int r=l+len-1;
if(s[l]s[r])
f[l][r]=(f[l][r-1]+f[l+1][r]+1)%mod;
else
f[l][r]=(f[l][r-1]+f[l+1][r]-f[l+1][r-1]+mod)%mod;
}
printf("Case %d: %d\n",k,f[0][n-1]);
}
}
[HDU4362] Palindrome subsequence (区间DP)的更多相关文章
- HDU4632:Palindrome subsequence(区间DP)
Problem Description In mathematics, a subsequence is a sequence that can be derived from another seq ...
- HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)
题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...
- HDU 4632 Palindrome subsequence (区间DP)
题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...
- hdu4632 Palindrome subsequence (区间dp)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4632 题意:求回文串子串的的个数. 思路:看转移方程就能理解了. dp[i][j] 表示区 ...
- HDU 4632 Palindrome subsequence(区间DP求回文子序列数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...
- Cheapest Palindrome(区间DP)
个人心得:动态规划真的是够烦人的,这题好不容易写出了转移方程,结果超时,然后看题解,为什么这些题目都是这样一步一步的 递推,在我看来就是懵逼的状态,还有那个背包也是,硬是从最大的V一直到0,而这个就是 ...
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
- POJ 题目3280 Cheapest Palindrome(区间DP)
Cheapest Palindrome Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7148 Accepted: 34 ...
- Cheapest Palindrome [POJ3280] [区间DP] [经典]
一句话题意:每个字母添加和删除都相应代价(可以任意位置 增加/删除),求把原串变成回文串的最小代价 Description 保持对所有奶牛的跟踪是一项棘手的任务,因此农场主约翰已经安装了一个系统来实现 ...
随机推荐
- 字符编码:Unicode和UTF-8的关系
今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思 ...
- 面向对象OONo.3单元总结
一,JML语言 1)JML理论基础:JML是一类语言,用来描述一个方法或一个类的功能.以及这个类在实现这个功能时需要的条件.可能改变的全局变量.以及由于条件问题不能实现功能时这个方法或类的行为,具有明 ...
- 课下作业04-2String的使用方法
1.动手动脑之String.equals()方法public class StringEquals { public static void main(String[] args) { String ...
- d3.js--02(data和datum原理)
原文链接: http://d3.decembercafe.org/pages/lessons/3.html 解析一下data和datum原理: datum():绑定一个数据到选择集上 data():绑 ...
- A. Vitya in the Countryside
A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...
- php代码压缩
php代码压缩,除可以使用token_get_all进行压缩之外,还可以使用系统自带的函数 php_strip_whitespace (PHP 5) php_strip_whitespace — ...
- 基于Centos7.2搭建Cobbler自动化批量部署操作系统服务
1 Cobbler服务器端系统环境配置 1.1 系统基本环境准备 [root@cobbler-server ~]# cat /etc/redhat-release CentOS L ...
- Verilog之语句位置
1.if语句.case语句必须放在always过程语句块中. 2.verilog的系统函数比如:\(display/\)monitor必须放在initial 过程语句块中.这点尚为理解为何,但必须这样 ...
- python 中 * 与**的使用
1.参数中使用如果是函数定义中参数前的*表示的是将调用时的多个参数放入元组中,**则表示将调用函数时的关键字参数放入一个字典中 如定义以下函数 def func(*args): print(args) ...
- redis集群监控之Redis-monitor部
为了对以后有可能面临的redis集群监控做准备,这两天在准备这方面的事情,现在将其中的过程记录一下. 首先是“Ronney-Hua”的这篇文章对三中开源监控软件做了对比 文章地址:https://bl ...