题目大意

原题链接,给定字符串求回文子序列数量。字符串长度 $len \leq 1000 $。

算法思路

题干比较简单,而且数据量不大,很容易想到使用递推,关键在于如何定义递推中间值和递推式。博主做题的时候首先想到定义数组 \(r[][]\), $r[i][j], i\leq j $ 表示以字符 \(str[j]\) 结尾,在区间 \([i,j]\) 中的回文子序列数量,就可以得到递推式 $ r[i][j] = 1 + r[i][j-1] + \sum_{k=i, str[k]=str[i]}^{j-1} {(1+r[k+1][j-1])} $. 递推的代码很好写,提交之后发现超时,仔细分析,复杂度为 \(O(n^3)\),无奈重新想递推关系。

吃过午饭,突然灵机一动,定义数组 \(r[i][j]\) 表示字符串区间 \([i,j]\) 内的回文子序列数量,
\[ \begin{equation} r[i][j] = \begin{cases} 0 & \mbox{if $ i > j $ }\\ 1 & \mbox{elif $ i = j $ }\\ r[i][j-1] + r[i+1][j] + 1 & \mbox{elif $ str[i] = str[j] $ }\\ r[i][j-1] + r[i+1][j] - r[i+1][j-1] & \mbox{if $ str[i] \neq str[j] $ } \end{cases} \end{equation} \]

大家注意 $r[i][j-1], r[i+1][j] $ 重复计算了区间 \([i+1,j-1]\)的回文子序列,应该减去,而\(str[i]=str[j]\) 情形时的1表示回文序列就是 \(str[i],str[j]\).这样复杂度就是 \(O(n^2)\) 啦,不会超时。

然而提交的时候出现了WA,百思不得其解,在我开始怀疑人生的时候突然想到,题目中要求对结果取模,因此可能在做减法的时候出现负数!

代码

#include <iostream>
#include <string>
#include <string.h>
using namespace std;const int md = 100007;string str;
int r[1004][1004]; // r[i][j] (i<=j) str([i,j]) str[j] int dp(int a, int b)
{if (r[a][b] != -1)return r[a][b];if (a > b)r[a][b] = 0;else if (a == b)r[a][b] = 1;else {if (str[a] == str[b]) {r[a][b] = dp(a, b - 1) + dp(a + 1, b) + 1;}else {r[a][b] = dp(a, b - 1) + dp(a + 1, b) - dp(a+1, b-1);}}r[a][b] = (r[a][b] + 2 * md) % md;           // 防止负数!return r[a][b];
}int main()
{int t;cin >> t;getline(cin, str);for(int q=1;q<=t;q++) {memset(r, 0xff, sizeof(int)*1004*1004);getline(cin, str);int len = str.length();cout << "Case #" << q << ": " << dp(0, len - 1) << endl;}return 0;
}

转载于:https://www.cnblogs.com/lessmore/p/hihocoder-1149.html

[动规] hihocoder 1149 回文字符序列相关推荐

  1. 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]

    传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...

  2. 2003基于栈的回文字符序列判断(C++)

    描述 回文序列是正反读均相同的字符序列,如"abba"和"abdba"均是回文,但是"good"不是回文.请设计一个算法判定给定的字符序列是 ...

  3. 题目2 : 回文字符序列(区间DP)

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串aba中,回文子序列为"a& ...

  4. python找出字符串中的最长回文串子序列

    回文串,即: nums = 'aba' print(nums == nums[::-1]) # True 反转该序列后和之前元素相等 这里我们需要找出给定字符串里的最长回文串,即: nums = 'a ...

  5. 回文字符(第一周技术分享)

    第一篇博客就来写一下这次面试婷婷学姐问我的一个问题吧! 最开始我只会用最笨的办法把每位上的数字都写出来 再去比较首末是否相等去判断是否为回文数. #include <stdio.h> in ...

  6. 数据结构——用栈解决回文字符问题

    回文 回文是指正读反读均相同的字符序列,如"abba"和"abdba"均是回文,但"good"不是回文.试写一个算法判定给定的字符序列是否为 ...

  7. 每天一道LeetCode-----最长回文子串/序列,从头开始的最长回文子串长度

    Longest Palindromic Substring 原题链接 Longest Palindromic Substring 意思是找到最长的回文子串,注意子串和子序列的区别 蛮力法就将每个可能的 ...

  8. HihoCoder 1323 回文字符串

    回文字符串 思路 动态规划: 可以有三种修改决策 将开头和结尾字符改成一样 在开头加一个和末尾相同的字符 在末尾加一个和开头形同的字符 代码: #include <stdio.h> #in ...

  9. matlab回文字符判断程序,(c语言)回文字符串的判断,gets和scanf

    问题描述:判断一个字符串是否是回文字符串.程序分析:回文字符串:回文字符串是指一个字符中的最高位与最低位的字符是一样的,次高位和次低位上的字符是一样的 问题描述: 判断一个字符串是否是回文字符串. 程 ...

最新文章

  1. 【数据平台】Eclipse+MapReduce开发环境(集群运行模式)
  2. 用户二次登陆,干掉第一次登录的session
  3. Android 中intent传递序列化信息(传递类)
  4. 怎么样开会才有效果?
  5. 查询HTML标签select中options的值并定位其位置
  6. powerdesigner辅助导入导出excel文件
  7. 售前工程师的成长---一个老员工的经验之谈(5)
  8. 索尼Xperia 5 II新品全球发布会官宣:9月19日11点见!
  9. 程序员奉劝年轻人转行趁早:工作8年存款百万,33岁找不到工作
  10. android人物移动设计软件,实现在SurfaceView上移动游戏人物
  11. 编写自己的代码库(javascript常用实例的实现与封装)
  12. Python 多进程multiprocessing
  13. 从JS库的使用者转变成JS的开发者——第一篇 javascript对象
  14. 基于YOLOv5的汽车座椅缺陷检测
  15. python答辩毕设ppt_毕设答辩ppt总结
  16. Logistic映射在图像加密中的应用
  17. 加号和减号在一起怎么读_数学符号里的“加减”是“±”,那么“减加”怎么打?求高手!!!!!!!!! word中加号和减号放在一起怎么打出来?...
  18. windows 下载和安装Qt Creator
  19. All the Windows 10 Technical Preview Editions ISO Direct Download Links !
  20. Apple苹果终端如何进行批量管理?

热门文章

  1. 在vs2012下编译出现Msvcp120d.dll 丢失的问题
  2. Linux01-BASH的while流程控制41
  3. DPM2010恢复exchange2010单个用户邮箱邮件
  4. 【position也可以很复杂】当弹出层遇上了鼠标定位(上)
  5. 仿京东左侧二级导航条
  6. VS2005使用點滴積累
  7. 体育馆黑名单系统 的设定
  8. final cut pro的vlog模版的需要region of interests和导出视频注意事项
  9. C++数组与指针回顾总结
  10. 每日阅读(产品) 汤道QQ与微信