1513 hdu Palindrome 滚动数组+LCS

62 篇文章 0 订阅

点击打开题目链接

由于单纯地求LCS会使得运行超时,因此需要想办法减少开支;

可以想到0-1背包问题是如何由二维减少到一维的,事实上,我们最后只需要计算的最后几个解,因此没有必要把每一步计算结果都储存起来,所以选用滚动数组来做;

最后求的dp[n%2][n]lcs长度,n - dp[n%2][n]即为所求:

#include<iostream>
#include<cstring>
#include <algorithm>

using namespace std;

#define MAX(a,b) (a > b ? a : b)

const int MAXN = 5010;

char str1[MAXN],str2[MAXN];
int dp[2][MAXN];
int n;

void slove()
{
     int i,j;
     strcpy(str2,str1);
     //strrev(str2,str2+n);
     reverse(str2,str2+n);
     memset(dp,0,sizeof(dp));
     for(i = 1; i <= n; ++i)
     {
          for(j = 1; j <= n; ++j)
          {
               if(str1[ i-1 ] == str2[ j-1 ])
               {
                    dp[i%2][j] = dp[(i-1)%2][j-1] + 1;
               }
               else
               {
                    dp[i%2][j] = MAX(dp[(i-1)%2][j],dp[i%2][j-1]);
               }
          }
     }
     cout<<n-dp[n%2][n]<<endl;
}



int main()
{
     while(cin>>n)
     {
          cin>>str1;
          slove();
     }
     return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值