zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/waterfalleagle/p/1594069.html
Copyright © 2011-2022 走看看