中等·Bamboo's Fight with DDLs II

分析

一句话:给定字符串,求最长回文子序列长度,动态规划LCS思想的进阶应用

具体思路如下:

对于任意字符串,如果头尾字符相同,那么字符串的最长回文子序列等于去掉首尾的字符串的最长子序列加上首尾;如果首尾字符不同,则最长回文子序列等于去掉头的字符串的最长回文子序列和去掉尾的字符串的最长回文子序列的较大者。

因此动态规划的状态转移方程为:

设字符串为str,长度为n,dp[i][j]表示第i到第j个字符间的回文子序列的最大长度(i<=j),则:

状态初始条件:dp[i][i]=1 (i=0:n-1)

状态转移方程:

  dp[i][j]=dp[i+1][j-1] + 2  if(str[i]==str[j])

  dp[i][j]=max(dp[i+1][j],dp[i][j-1])  if (str[i]!=str[j])

你可能已经发现,这和LCS的状态转移几乎没什么两样,没错,最长回文子序列LPS其实就是最长公共子序列LCS,为什么呢?你想一下,如果把字符串反转,看作第二个字符串,那我要求的,不就是这两个字符串的LCS吗?对不对,对不对!

代码样例

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxx = 505;
int dp[maxx][maxx];
string str;
int main()
{
while(cin>>str)
{
for(int i = 0;i<maxx;i++)
dp[i][i]=1;
int len = str.length();
for(int i = len-1;i>=0;i--)
for(int j = i+1;j<len;j++)
{
if(str[i]==str[j])
dp[i][j]=dp[i+1][j-1]+2;
else
dp[i][j]=max(dp[i+1][j],dp[i][j-1]); }
printf("%d\n",dp[0][len-1]);
}
}

最新文章

  1. window下xampp配置多端口、多站点步骤
  2. gRPC+etcd的优势分析
  3. LeetCode 6 ZigZag Conversion 模拟 难度:0
  4. node3
  5. redis密码设置、访问权限控制等安全设置
  6. linux实现rdp访问
  7. [poj3349]Snowflake Snow Snowflakes(hash)
  8. HTTP 错误 500.19 - Internal Server Error
  9. CSS 分组 和 嵌套 选择器
  10. JDBC插入百万数据,不到5秒!
  11. java中等于和equals的区别
  12. 《互联网初创企业password》书评
  13. 关于01背包求第k优解
  14. hdu4416 Good Article Good sentence (后缀数组)
  15. Python内置函数(40)——dir
  16. 一、Java 23 种设计模式简介
  17. Javascript中的this关键字用法详解
  18. Intel Fortran 调用Delphi编制的DLL
  19. 引用:WebAPI中的定时处理-使用Quartz.Net
  20. pyenv docter检测出configure: error: OpenSSL is not installed.解决方案

热门文章

  1. asp.net安装指令
  2. python在windows环境安装MySQLdb
  3. code1167 树网的核
  4. android textview 显示一行,且超出自动截断,显示&quot;...&quot;
  5. 马婕 2014MBA专硕考试 报刊选读 3 禽流感考验政府的透明度(转)
  6. RocketMQ runbroker.sh 分析JVM启动参数
  7. Python之模块和包学习
  8. Linux 基础教程 31-tcpdump命令-3
  9. 更改mysql默认字符集 (转载)
  10. Vue基本使用---对象提供的属性功能