POJ1159(最长公共子序列变形+滚动数组)

太菜了,参考大佬的博客知道了解题思路。

 题意很简单,要求插入一定数目的字符使给定字符串成为回文字符串,问最小数目?这道题一个良好的解法是求给定字符串以及其逆串的最长公共子序列,用串长减去最长公共子序列就是结果。(不知道怎么证明的,但是一想貌似是对的)

下一个重点是dp数组的存储,有两种方式,使用short int型数字和滚动数组,先附上short int 型代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=5005;
short int dp[maxn][maxn];
int n;
string str1;
string str2;
int lenth1,lenth2;
void lcs()
{
    memset(dp,0,sizeof(dp));
    lenth1=str1.length();//length返回string中字符的个数
    lenth2=str2.length();
    for(int i=0; i<=lenth1; i++)
        for(int j=0; j<=lenth2; j++)
        {
            if(i==0||j==0)
                dp[i][j]=0;
            else if(str1[i-1]==str2[j-1])
                dp[i][j]=dp[i-1][j-1]+1;
          
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值