[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 保持对所有奶牛的跟踪是一项棘手的任务,因此农场主约翰已经安装了一个系统来实现 ...
随机推荐
- ubuntu18.04 安装五笔拼音
sudo apt install fcitx-table-wubi fcitx-table-wbpy 在输入法中加入五笔拼音就可以了,如果原来使用的是ibus, 改为fcitx后,重启机器.
- JQuery EasyUI学习记录(四)
1.EasyUI中的validatebox使用 提供的校验规则: 1.非空校验required="required" 2.使用validType指定 email: 正则表达式匹配电 ...
- 解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题
打开文件./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py 把第 3395 行 改为 : library = cdll.Lo ...
- JavaScript的基础知识
1,标识符 标识符是程序中常量或变量命名的一种术语称呼,并不是所有的字符组成都是一个合法的标识符,规范如下: 标识符的组成部分可以是字母,数字,下划线或美元($)符号 标识符开头是字母,下划线或美元( ...
- [Codeforces Round #250]小朋友和二叉树
题目描述: bzoj luogu 题解: 生成函数ntt. 显然这种二叉树应该暴力薅掉树根然后分裂成两棵子树. 所以$f(x)= \sum_{i \in c} \sum _{j=0}^{x-c} f( ...
- 【动态规划】bzoj1939: [Croatian2010] Zuma
隐约记得类似的一道JSOI祖玛……然后好像这题不能够把珠子合并成一段?或许是因为这里珠子碰在一起之后可以不消除? Description 有一行 N 个弹子,每一个都有一个颜色.每次可以让超过 K 个 ...
- MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins
MySQL 查询优化之 Block Nested-Loop 与 Batched Key Access Joins 在MySQL中,可以使用批量密钥访问(BKA)连接算法,该算法使用对连接表的索引访问和 ...
- 如何下载并安装 robomongo 到Ubuntu 系统
官网下载软件,https://robomongo.org/download wget https://download.robomongo.org/1.2.1/linux/robo3t-1.2.1-l ...
- 搭建本地虚拟服务器linux(CentOS 7)的python虚拟环境(Hyper-V演示)
新建虚拟机->安装CentOS7->新建虚拟交换机:内部网络->CentOS7设置->网络适配器:虚拟交换机:新建虚拟交换机->进入CentOS # cd /etc/sy ...
- 线段树:CDOJ1591-An easy problem A (RMQ算法和最简单的线段树模板)
An easy problem A Time Limit: 1000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Pr ...