题目链接


题目大意

给你几个字符串 (1<len(s)<1000) ,要你求每个字符串的回文序列个数.对于10008取模.


Solution

区间DP。

比较典型的例题。

状态定义:

令 \(f[i][j]\) 表示 \(i\) 到 \(j\) 的回文序列个数,\(s\) 为给出的字符串.

状态转移:

  1. \(s[i]\neq s[j]\)

    那么此时 \(f[i][j]\) 即为\(f[i][j-1]\),\(f[i+1][j]\)之和.

    但由于 \(i+1->j-1\)的我们明显重复统计了,所以方程即为:

\[f[i][j]=f[i+1][j]+f[i][j-1]-f[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)的更多相关文章

  1. HDU4632:Palindrome subsequence(区间DP)

    Problem Description In mathematics, a subsequence is a sequence that can be derived from another seq ...

  2. HDU 4632 Palindrome subsequence(区间dp,回文串,字符处理)

    题目 参考自博客:http://blog.csdn.net/u011498819/article/details/38356675 题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. ...

  3. HDU 4632 Palindrome subsequence (区间DP)

    题意 给定一个字符串,问有多少个回文子串(两个子串可以一样). 思路 注意到任意一个回文子序列收尾两个字符一定是相同的,于是可以区间dp,用dp[i][j]表示原字符串中[i,j]位置中出现的回文子序 ...

  4. hdu4632 Palindrome subsequence (区间dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4632 题意:求回文串子串的的个数. 思路:看转移方程就能理解了. dp[i][j] 表示区 ...

  5. HDU 4632 Palindrome subsequence(区间DP求回文子序列数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 题目大意:给你若干个字符串,回答每个字符串有多少个回文子序列(可以不连续的子串).解题思路: 设 ...

  6. Cheapest Palindrome(区间DP)

    个人心得:动态规划真的是够烦人的,这题好不容易写出了转移方程,结果超时,然后看题解,为什么这些题目都是这样一步一步的 递推,在我看来就是懵逼的状态,还有那个背包也是,硬是从最大的V一直到0,而这个就是 ...

  7. POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)

    题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...

  8. POJ 题目3280 Cheapest Palindrome(区间DP)

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7148   Accepted: 34 ...

  9. Cheapest Palindrome [POJ3280] [区间DP] [经典]

    一句话题意:每个字母添加和删除都相应代价(可以任意位置 增加/删除),求把原串变成回文串的最小代价 Description 保持对所有奶牛的跟踪是一项棘手的任务,因此农场主约翰已经安装了一个系统来实现 ...

随机推荐

  1. iOS 微信和支付宝关于回调处理

    在支付这一块,发现讲支付集成的比较多,但是关于支付后回调处理的不多见,(当时因为这个问题懵逼了好久)就自己总结一下, 1.支付宝回调 支付宝的回调想对来说比较简单一些,因为支付宝的回调就在调起支付宝的 ...

  2. [机器视觉] SIFT特征-尺度不变特征理解

    SIFT特征-尺度不变特征理解 简介 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述.这种描述具有尺度不变性 ...

  3. java sql database相关收集

    1 java prepareStatement http://www.importnew.com/5006.html 2 java ENGINE=InnoDB的使用 http://www.cnblog ...

  4. java,求1-100之和。

    package study01; public class TestWhile { public static void main(String[] args) { int sum = 0; int ...

  5. ORACLE的SQL JOIN方式大全

    ORACLE的SQL JOIN方式大全 在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结),官方的解释如下所示 A join is a que ...

  6. GCD之dispatch queue

    GCD之dispatch queue iOS中多线程编程工具主要有: NSThread NSOperation GCD 这三种方法都简单易用,各有千秋.但无疑GCD是最有诱惑力的,因为其本身是appl ...

  7. 简单的Datable转List方法

    public static class DataTableUtils<T> where T : new() { public static List<T> ConvertToM ...

  8. win8/10 bcdboot引导修复命令的原理和使用方法

    win8/10 bcdboot引导修复命令的原理和使用方法 [迅维网原创文章禁止转载] (本文所述已用UEFI+GPT.BIOS+MBR,WIN10 64位企业版和专业版测试过) 在win8/10系统 ...

  9. printk的使用技巧

    在 linux/kernel.h 中有相应的宏对应. #define KERN_EMERG    "<0>"    /* system is unusable */#d ...

  10. unix cc编译过程

    1.编译并链接一个完全包含与一个源文件的C程序:                cc program.c     这条命令产生一个称为a.out的可执行程序.中间会产生一个名为program.o的目标 ...