时间限制:2000ms
单点时限:1000ms
内存限制:256MB
描述
给定字符串,求它的回文子序列个数。回文子序列反转字符顺序后仍然与原序列相同。例如字符串aba中,回文子序列为”a”, “a”, “aa”, “b”, “aba”,共5个。内容相同位置不同的子序列算不同的子序列。

输入
第一行一个整数T,表示数据组数。之后是T组数据,每组数据为一行字符串。

输出
对于每组数据输出一行,格式为”Case #X: Y”,X代表数据编号(从1开始),Y为答案。答案对100007取模。

数据范围
1 ≤ T ≤ 30
小数据
字符串长度 ≤ 25
大数据
字符串长度 ≤ 1000

样例输入
5
aba
abcbaddabcba
12111112351121
ccccccc
fdadfa
样例输出
Case #1: 5
Case #2: 277
Case #3: 1333
Case #4: 127
Case #5: 17

分析:
1. 区间型DP, 先来说一下状态方程: 如求i到j这个区间共有多少回文子序列 ,两种情况①当s[i] == s[j]时,例如“a….a”,d[i][j] = d[i][j-1] + d[i+1][j] + 1(由d[i][j] = 2*d[i+1][j-1] + d[i][j-1] + d[i+1][j] + 1 - 2*d[i+1][j-1] 化简来的。 解释:已知 i+1 到 j-1 有d[i+1][j-1]个回文子序列, 又有s[i] == s[j], 那么可与中间(串i+1到j-1)已知的回文子序列再构成d[i+1][j-1]个回文子序列,再加上原来中间串所包含的回文子序列共2*d[i+1][j-1]个, 两个a组合”aa”也是回文, 所以再加1, 再分别计算左、右两边的a和中间串所构成的回文子序列, 但是这个时候还没完,注意:在分别计算左右两边a和中间串时,又算了两遍中间串包含的回文子序列, 所以在减去2*d[i+1][j-1]个);②当s[i] != s[j]时,d[i][j] = d[i][j-1]+d[i+1][j] - d[i+1][j-1]。这个自己应该也能分析出来,和上面类似。
2. 求区间i到j时, 会用到d[i+1][j-1], d[i][j-1], d[i+1][j]。 这也正是为什么区间型DP一般都是从相距较小的区间开始, 然后不扩大区间。当下所求区间(i, j)所用的子区间,之前都已求完,so还是那句话,直接用就好啦。
那个地方意见不一致欢迎指出,互相学习!!

#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
using namespace std;const int MOD = 100007;int t, len, d[1010][1010];
char s[1010];void dp()
{for(int i = 1; i < len; i++){for(int j = 0; j < (len - i); j++){if(s[j] == s[j+i])d[j][i+j] = (d[j][i+j-1] + d[j+1][i+j] + 1) % MOD;elsed[j][i+j] = (d[j][i+j-1] + d[j+1][i+j] - d[j+1][i+j-1] + MOD) % MOD;}}
}
int main()
{cin >> t;for(int q = 1; q <= t; q++){memset(s, 0, sizeof(s));memset(d, 0, sizeof(d));cin >> s;len = strlen(s);for(int i = 0; i < len; i++) d[i][i] = 1;dp();printf("Case #%d: %d\n", q, d[0][len-1] % MOD);}return 0;
}

2015编程之美资格赛 回文子序列个数相关推荐

  1. 字符串的回文子序列个数_计算给定字符串中回文子序列的数量

    字符串的回文子序列个数 Problem statement: 问题陈述: Given a string you have to count the total number of palindromi ...

  2. 算法62---最长回文子序列长度(子串)、回文子序列总共个数(子串)【动态规划】...

    参考链接:https://www.cnblogs.com/AndyJee/p/4465696.html 一.题目:最长回文子序列长度 给定字符串,求它的最长回文子序列长度.回文子序列反转字符顺序后仍然 ...

  3. 动态数组怎么定义_动态规划最长回文子序列

    动态规划|最长回文子序列 今天一起来学习Leetcode第 516 题:最长回文子序列. 题目描述 题目分析 首先回文字符串指的是形如"a","aa",''ab ...

  4. leetcode算法题--最长回文子序列★★

    原题链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence/ 注意不是回文子串,子串必须是连续! dp[i][j]表示字 ...

  5. 最长回文子序列(LPS)

    问题描述: 回文是正序与逆序相同的非空字符串,例如"civic"."racecar"都是回文串.任意单个字符的回文是其本身. 求最长回文子序列要求在给定的字符串 ...

  6. 120. Leetcode 516. 最长回文子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示的是字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j] 步骤二.推断状态方程: 如果当前的s[i] == s[j], ...

  7. C++longest palindromic subsequence最长回文子序列算法实现(附完整源码)

    C++longest palindromic subsequence最长回文子序列算法 C++longest palindromic subsequence最长回文子序列算法实现完整源码(定义,实现, ...

  8. leetcode516. 最长回文子序列(动态规划)

    ***给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度.***可以假设 s 的最大长度为 1000 . 示例 1: 输入: "bbbab" 输出: 4 一个可能的 ...

  9. 动态规划求一个序列的最长回文子序列(Longest Palindromic Substring )

    1.问题描述 给定一个字符串(序列),求该序列的最长的回文子序列. 2.分析 需要理解的几个概念: ---回文 ---子序列 ---子串 http://www.cnblogs.com/LCCRNblo ...

最新文章

  1. 在oracle的安全策略中,Oracle数据库的安全策略(转)
  2. Python的命名空间和作用域
  3. 解决mysqlAccess denied for user'root'@'IP地址'问题
  4. Java环境变量配置详细步骤
  5. python视频教程免费 西西-Python基础教程(第2版)
  6. 设计模式的C语言应用-命令模式-第五章
  7. linux psftp,使用PSFTP实现Windows、Linux之间的文件传输
  8. java编写文本编辑器_基于java实现文本编辑器.doc
  9. 苹果/安桌点歌系统代码
  10. 线程池使用不当导致系统假死
  11. SAR图像滤波去噪效果评价研究
  12. 经典的01背包问题(挖金矿)
  13. 实测 CSDN开发助手-Chrome插件
  14. 05.odoo12开源框架学习
  15. Chinese Segmentation Introduction
  16. Relation-Aware Global Attention
  17. Hibernate第三讲:Hibernate主键策略和Hibernate的查询方案
  18. 安装64位win7(适合没有4G以上U盘或DVD光驱)
  19. 服务器中病毒要不要重装系统,五种情况必须要给电脑重装系统,这三种不用重做系统,别被骗了...
  20. cucumber生成测试报告

热门文章

  1. 网络游戏中的游戏模式如MMOPRG,PRG,NPRG等是什么意思?
  2. 【C语言基础补充7】使用预处理让你的代码不再臃肿
  3. 中科院成都计算机研究所李品导师,2011年中科院成都计算机应用研究所研招招生目录书目...
  4. idea手动打包Docker部署linux
  5. 时间管理之“四象限”法
  6. ASP.NET动态网站开发培训-03.创建第一个ASP.NET的动态网站
  7. 关于Linux下C语言开发基础的实验内容。
  8. Unity文件和目录操作
  9. OPPO R11完美助攻,男友这样拍照你会更开心
  10. 用pyui4win快速开发小妞会装机