vj p1327题解

原题叙述

此题有两解:

1.直接法:

由题可知:f[i,j]表示字串i到j部分的构成回文的最少添加字符数,所以

      f[i,j]:=min(f[i+1,j]+1,f[i,j-1]+1,f[i+1,j-1]+ord(a[i]<>a[j])*2);

      可递归求得。

      但是由于此题的时间限制以及递归过程中调用函数缓慢,会导致部分数据超时。结果只有82分。

代码如下:

 

var
        n,i,j:integer;
        f:
array[0..5001,0..5001]of integer;
        a,b:
array[0..5001]of char;
function find(i,j:integer):integer;
var
        t1,t2,t3:longint;
begin
        
if f[i,j]<0 then
                
begin
                        
if i>=then f[i,j]:=0
                        
else
                        
begin
                                t1:
=find(i+1,j)+1;
                                t2:
=find(i,j-1)+1;
                                t3:
=find(i+1,j-1)+ord(a[i]<>a[j])*2;
                                f[i,j]:
=t1;
                                
if f[i,j]>t2 then f[i,j]:=t2;
                                
if f[i,j]>t3 then f[i,j]:=t3;
                        
end;
                
end;
        find:
=f[i,j];
end;
begin
        readln(n);
        
for i:=1 to n do read(a[i]);
        fillchar(f,sizeof(f),
255);
        
for i:=1 to n do f[i,i]:=0;
        writeln(find(
1,n));
end.

 

2.间接法:

题目可转换为,求字符串和这个字符串逆序的最大匹配子串长度,然后再与总长度求差,即为最少需添加字符构成回文串数。

f[i,j]:=f[i-1,j-1]+1;(a[i]=b[i])

f[i,j]:=min(f[i-1,j],f[i,j-1]);(a[i]<>b[i])

代码如下:

 

var
        n,i,j,t1,t2,t3:integer;
        f:
array[0..5001,0..5001]of integer;
        a,b:
array[0..5001]of char;
begin
        readln(n);
        
for i:=1 to n do
                
begin
                        read(a[i]);
                        b[n
-i+1]:=a[i];
                
end;
        fillchar(f,sizeof(f),
0);
        
for i:=1 to n do
                
for j:=1 to n do
                        
begin
                                
if a[i]=b[j] then f[i,j]:=f[i-1,j-1]+1
                                
else
                                        
if f[i-1,j]>f[i,j-1then f[i,j]:=f[i-1,j]
                                        
else
                                                f[i,j]:
=f[i,j-1];
                        
end;
        writeln(n
-f[n,n]);
end.

 

posted @ 2009-11-01 21:14  瀑布飞鹰  阅读(156)  评论(0编辑  收藏  举报