hdu1513 最长回文子序列
2014-05-02 23:16
148 查看
求最长回文自序列经典做法 反转目标串求lcs
dp方程: s[i]==s[j]:dp[i][j]=dp[i+1][j-1]+1
else dp[i][j]=max(dp[i+1][j],dp[i][j-1])
其中 下标i,j表示从i到j的最大公共子序列
但是这样做会需要开dp[5000][5000]--mle
所以要只保存当前状态 和 前一状态 也就是i-1态
这个做法和概率dp有点相似的
下标表示是 i&1
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 5555
char s1[maxn],s2[maxn];
int dp[2][maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%s",s1);
strcpy(s2,s1);
for(int i=0;i<n;++i)
s2[i]=s1[n-1-i];
memset(dp,0,sizeof dp);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(s1[i-1]==s2[j-1])
dp[i&1][j]=dp[(i-1)&1][j-1]+1;
else
dp[i&1][j]=max(dp[(i-1)&1][j],dp[i&1][j-1]);
printf("%d\n",n-dp[n&1]
);
}
return 0;
}
dp方程: s[i]==s[j]:dp[i][j]=dp[i+1][j-1]+1
else dp[i][j]=max(dp[i+1][j],dp[i][j-1])
其中 下标i,j表示从i到j的最大公共子序列
但是这样做会需要开dp[5000][5000]--mle
所以要只保存当前状态 和 前一状态 也就是i-1态
这个做法和概率dp有点相似的
下标表示是 i&1
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 5555
char s1[maxn],s2[maxn];
int dp[2][maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
scanf("%s",s1);
strcpy(s2,s1);
for(int i=0;i<n;++i)
s2[i]=s1[n-1-i];
memset(dp,0,sizeof dp);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(s1[i-1]==s2[j-1])
dp[i&1][j]=dp[(i-1)&1][j-1]+1;
else
dp[i&1][j]=max(dp[(i-1)&1][j],dp[i&1][j-1]);
printf("%d\n",n-dp[n&1]
);
}
return 0;
}
相关文章推荐
- leetcode 516. Longest Palindromic Subsequence 最长回文子序列 + DP动态规划
- 最长回文子序列 区间dp
- 滴血总结(java版):最长公共子序列(子串)、最长公共回文子序列(子串)、最长公共前缀(后缀)
- UVa 11404 回文子序列(LCS求最长回文串长度)
- 区间dp最长回文子序列问题
- 最长回文子序列 递归算法
- 动态规划,最长回文子序列(java实现),输入character,算法应该返回carac
- 【JZOJ4889】【NOIP2016提高A组集训第14场11.12】最长公共回文子序列
- poj1159 Palindrome 【最长回文子序列】
- 最长回文子序列(double point)
- (动态规划)最长回文子序列、回文子序列个数
- HDU 4745 (区间dp ,最长非连续回文子序列)
- hdu - 4745 - Two Rabbits(最长回文子序列)
- 算法导论思考题15.2(最长回文子序列)
- LeetCode_5_LongestPalindromicSubstring(最长回文子序列)
- 算法导论 思考题 15-2(最长回文子序列)
- 最长回文子序列与最长回文子串
- UVa 11404 - Palindromic Subsequence (最长回文子序列 DP)
- 最长回文子序列
- 最长的回文子序列