C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

poj 1159 Palindrome NYOJ 37 回文字符串(DP)

Posted on 2012-04-10 21:01 C小加 阅读(1477) 评论(0)  编辑 收藏 引用 所属分类: 解题报告

这道题有两种解法:

第一种:求s~sLCS,然后套用公式length-LCS长度 即为所求。

第二种:直接DP求解。

s[i] == s[j]  f[i][j]=f[i+1][j-1]

  s[i] != s[j]  f[i][j]=min(f[i+1][j],f[i][j-1])+1;

 

这个题我用的是一个大型的二维数组,代码很水,不建议欣赏。

 

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXM=1001;
short int  f[MAXM][MAXM];
char s[1001];
int LCS()
{

    scanf("%s",s);
    memset(f,0,sizeof(f));
    int len=strlen(s);
    for(int i=0;i<len;++i)
    {
        for(int j=i;j>=0;--j)
        {
            if(s[i]==s[j])
            {
                f[i+1][j+1]=f[i][j+2];
            }
            else
            {
                f[i+1][j+1]=min(f[i][j+1],f[i+1][j+2])+1;
            }
        }
    }
    return f[len][1];
}

int main()
{
    int n;

    cin>>n;
    while(n--)
    {
        printf("%d\n",LCS());
    }


    return 0;
}
                


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理