求回文子序列个数(DP)
来源:互联网 发布:淘宝网狗狗用品 编辑:程序博客网 时间:2024/04/28 04:59
题意(事实上未曾找到相关题目):
给定一字符串,求它的回文子序列个数。内容相同位置不同的子序列算不同的子序列。
例如字符串aba中,回文子序列为"a", "a", "aa", "b", "aba",共5个。
思路:
对于任意字符串,如果头尾字符不相等,则字符串的回文子序列个数就等于去掉头的字符串的回文子序列个数+去掉尾的字符串的回文子序列个数-去掉头尾的字符串的回文子序列个数;如果头尾字符相等,则字符串的回文子序列个数就等于去掉头的字符串的回文子序列个数+去掉尾的字符串的回文子序列个数+1。
用dp[i][j]表示第i到第j个字符间的最长回文子序列的长度(i<=j),则状态转移方程为:
dp[i][j]=dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1] , if(s[i]!=s[j])
dp[i][j]=dp[i+1][j] + dp[i][j-1] +1 , if (s[i]==s[j])
代码:
#include <iostream>using namespace std;int dp[200][200];string str;int solve(){int l=str.length(); for(int j=0;j<l;++j){ dp[j][j]=1; for(int i=j-1;i>=0;--i){ if(str[i]==str[j]) dp[i][j]=dp[i+1][j]+dp[i][j-1]+1; else dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1]; } } return dp[0][l-1];}int main(){ while(cin>>str){ cout<<solve()<<endl; } return 0;}
0 0
- 求回文子序列个数(DP)
- hihoCoder1149 求回文子序列数 dp
- uva 10617 Again Palindrome(dp,容斥原理,求字符串内回文子序列的个数)
- zoj 2744 Palindromes (求回文子序列的个数)
- 子序列个数(DP)
- 回文子序列个数 C++
- FZU2129 子序列个数(dp求不同子序列个数)
- HDU 5791 Two (dp求公共子序列个数)
- hdu5791 Two(dp求公共子序列个数)
- (动态规划)最长回文子序列、回文子序列个数
- (动态规划)最长回文子序列、回文子序列个数
- 求子序列 DP
- FZU2129 子序列个数 DP
- 子序列个数 (DP)
- 求奇偶子回文串个数
- 最长回文子串、最长回文子序列、回文子序列个数
- 动态规划求最长回文子序列
- 【DP】 最长公共回文子序列
- Java8新特性之lambda
- Android_三种菜单介绍
- 腾讯2017 (移动开发岗位)9月份秋招笔试 试题总结
- [实验室]2016.9.16
- POJ - 3181 Dollar Dayz(多重背包)
- 求回文子序列个数(DP)
- Java线程死锁
- Linux(CentOS6.5)下编译安装Nginx1.10.1
- 超级简单的Android Studio jni 实现(无需命令行)
- 单片机程序主函数中while(1)的作用
- 算法:位操作总结
- 一个程序员的自我修养
- leetcode---Construct Binary Tree from Preorder and Inorder Traversal---树的构建
- XML学习笔记(二)-- DTD格式规范