uva 10453 Make Palindrome

题意:给你n个串(长度最多为1000),问对于每个串插入最少多少m个字符能使它变成一个回文串。输出m,并把回文串输出.

看了解题报告。总结,还要随便用memset,否则会T。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1005;
struct node
{
    int cost,cmd;
    int x,y;
    void fz(int b,int c,int d){cmd=b;x=c;y=d;}
}map[N][N];
int le,ri;
char L[N],R[N],str[N];
int fun(int,int );
int print_ans(int,int);
int main()
{
    while(gets(str+1))
    {
        le=0;ri=0;
        int len=strlen(str+1);
        printf("%d ",fun(1,len));
        print_ans(1,len);
        L[le]='\0';printf("%s",L);
        for(int i=ri-1;i>=0;i--) putchar(R[i]);
        puts("");
        for(int i=0;i<=len;i++)
        {
            for(int j=0;j<=len;j++)
            {
                map[i][j].cost=0;
            }
        }
    }
    return 0;
}
int fun(int x,int y)
{
    if(x>=y){return 0;}
    else if(map[x][y].cost) return map[x][y].cost;
    else
    {
        if(str[x]==str[y])
        {
            map[x][y].cost=fun(x+1,y-1);
            map[x][y].fz(3,x+1,y-1);
        }
        else
        {
            int temp1=fun(x,y-1)+1,temp2=fun(x+1,y)+1;
            if(temp1>temp2)
            {
                map[x][y].cost=temp2;
                map[x][y].fz(2,x+1,y);
            }
            else
            {
                map[x][y].cost=temp1;
                map[x][y].fz(1,x,y-1);
            }
        }
        return map[x][y].cost;
    }
}
int print_ans(int x,int y)
{
    if(x==y)
    {
        L[le++]=str[x];
        return 1;
    }
    if(map[x][y].cmd==1)
    {
        L[le++]=str[y];
        R[ri++]=str[y];
    }
    else if(map[x][y].cmd==2)
    {
        L[le++]=str[x];
        R[ri++]=str[x];
    }
    else if(map[x][y].cmd==3)
    {
        L[le++]=str[y];
        R[ri++]=str[y];
        if(x==y-1)return 1;
    }
    if(print_ans(map[x][y].x,map[x][y].y)) return 1;
    return 0;
}


你可能感兴趣的:(uva 10453 Make Palindrome)