poj1159

【题意】

给定一个长度为n(n<=5000)的字符串,求最少加入多少个字符可以使他变为回文串

【输入】

第一行一个n

接下来一行n个字符表示字符串

【输出】

一个数字,表示最少加入多少个字符可以使他变为回文串


将原串反过来求两串的最长公共子序列

然后拿n减去即可


program poj1159;
var
  n,i,j,k,o:longint;
  s1,s2:ansistring;
  f:array [0..1,0..5001] of longint;
begin
  readln(n);
  readln(s1);
  for i:=1 to n do
    s2:=s2+s1[n-i+1];
  fillchar(f,sizeof(f),0);
  o:=0;
  for i:=1 to n do
    begin
      o:=1-o;
      for j:=1 to n do
        begin
          f[o,j]:=f[1-o,j];
          if f[o,j]<f[o,j-1] then f[o,j]:=f[o,j-1];
          if (s1[i]=s2[j])and(f[o,j]<f[1-o,j-1]+1) then f[o,j]:=f[1-o,j-1]+1;
        end;
    end;
  writeln(n-f[o,n]);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值