构造回文串(简单DP)

题目来源:[NWPU][2014][TRN][6]动态规划第一讲——简单线性dp H题

http://vjudge.net/contest/view.action?cid=49759#problem/H

作者:npufz

题目:给定一个字符串,为使之变成一个回文串,即从左读或者从右读是完全等价的,需要添加一些字符进去,可以添加到任意位置,但不能打乱原来的字符的次序,求算出添加              最少的字符的个数,给定的字符串最多有5000个字符,最少有3个字符

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
short   dp[5005][5005];
int main()
{  int i,j,k,num;
   char   s1[5005],s2[5005];
   cin>>num;
   scanf(" %s",s1);
   j=0;
   for(i=num-1;i>=0;i--)
   s2[j++]=s1[i];
   //s2[j]='\0';puts(s2);
   if(s1[0]==s2[0])  dp[0][0]=1;
   for(i=0;i<num;i++)
    for(j=0;j<num;j++)
   {
     if(i==0&&j-1>=0)
       {
        if(s1[0]==s2[j]) dp[0][j]=1;
        else  dp[0][j]=dp[0][j-1];
       }
      if(j==0&&i-1>=0)
      {
          if(s1[i]==s2[0])  dp[i][0]=1;
          else dp[i][0]=dp[i-1][0];
      }
    if(i-1>=0&&j-1>=0)
    {
        if(s1[i]!=s2[j])  dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        if(s1[i]==s2[j])
        {
            if(dp[i-1][j-1]+1>max(dp[i-1][j],dp[i][j-1]))
                  dp[i][j]=dp[i-1][j-1]+1;
            else  dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
        }
    }
}
k=num-dp[num-1][num-1];
cout<<k<<endl;
return 0;
}

反思:这是一个简单的DP,但是第一次就MLE 了,由于规划数组开的太大,改成SHORT的就OK了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值