题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632

问题要求回答一串字符串中回文子序列的数量,例如acbca就有 a,c,b,c,a,cc,aa,aca,aca(注意这两个aca的c是不同位置的c,都要累计),aba,cbc,acca,acbca.共13种。

我们如果构造dp[i][j]为区间从i-j的回文子序列个数,当i==j时dp[i][j]=1,当i!=j时,如果字符串i,j位相等,他们便可以从dp[i+1,j-1]转移而来,即dp[i][j]=dp[i+1][j-1]*1+1(这里特地写成*1,因为不是单纯的计数+1,是原先区间[i+1,j-1]的所有回文子序列都可以在左右增加一个当前字符构成新的回文序列,同时还加入单独以两个当前字符构成的回文序列)。这里就计算了以当前字符作为左右临界的回文序列个数,除此之外还需要继承子区间所有的回文序列,这个就与字符i,j是否相等无关了。注意这里不能直接累加dp[i+1][j-1],因为会忽略i+k与j以及i与j-k为左右临界的子序列数。因此dp[i][j]+=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1](两区间累加,去除重复区间).

#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
#include <algorithm>
#include <queue>
#include <cstring>
#define LL long long int
using namespace std; const int mod=;
int dp[][];
int main(){
int n,k;
cin.sync_with_stdio(false);
cin>>n;
int cas=;
while(n--)
{
string s;
cin>>s;
for(int i=;i<s.length();i++)
for(int j=;j<s.length();j++)
dp[i][j]=(i==j);
for(int i=s.length()-;i>=;i--)
{
for(int j=;j<s.length();j++)
{
if(i>=j)
continue;
dp[i][j]=(dp[i+][j]+dp[i][j-]+mod-dp[i+][j-])%mod;
if(s[i]==s[j])
dp[i][j]+=dp[i+][j-]+;
dp[i][j]%=mod;
}
}
cout<<"Case "<<cas++<<": "<<dp[][s.length()-]<<endl;
}
return ;
}

最新文章

  1. haskell debug
  2. GDB调试汇编栈堆过程的学习
  3. 关于那些难改的bug
  4. 编写linux驱动所用到的头文件(转)
  5. 【转载】怎么理解Condition
  6. POI操作Excel常用方法总结
  7. 深入浅出—JAVA(7)
  8. 华为软件开发云CloudIDE功能简测
  9. Shell编程之文本处理
  10. 使用 Premiere 制作视频简介
  11. POJ 2368 Buttons
  12. Web获取客户端物理MAC地址(ocx插件)ActiveX控件
  13. 你了解ECMAScript吗?
  14. python的面向对象-实例(对象)的相关知识、实例化
  15. jQuery Datepicker 插件遇到问题
  16. MP3 ID3信息编辑器(附源码)
  17. SQL语言基本操作(聚合函数)
  18. STS - 配置Tomcat 运行路径
  19. ES正在弱化type这个概念
  20. Listener监听器之HttpSessionListener

热门文章

  1. Python3 tkinter基础 Label imag显示图片
  2. luogu1975 [国家集训队]排队
  3. Shiro学习笔记五(Shiro标签,及通配符)
  4. windows下的安装及使用 python
  5. Highlight.js语法突出显示
  6. 1、Python模块和包(0602)
  7. phpstorm软件配置端口问题
  8. 【Mysql】外键
  9. 新加坡金融科技节 | 蚂蚁金服CTO程立:面向全球开放,与合作伙伴共赢
  10. Bootstrap &amp; Font Awesome 学习笔记