关闭

poj1159

标签: pojDP算法
33人阅读 评论(0) 收藏 举报
分类:

short int

#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>

using namespace std;
char a[5001],b[5001];
short int dp[5001][5001];
int n;

int solve()
{
    memset(dp,0,sizeof(dp));
    for(int i=n-1,j=0;i>=0;--i,++j)
        b[j] = a[i];
    for(int i=0;i<n;++i)
        for(int j=0;j<n;++j)
            if(*(a+i)==*(b+j))
                dp[i+1][j+1]=dp[i][j]+1;
            else
                dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
    return n-dp[n][n];
}

int main()
{
   while(scanf("%d",&n)!=EOF)
   {
        scanf("%s",a);
        printf("%d\n",solve());
   }

    return 0;
}

roll

#include <iostream>
#include <cstdio>
#include <cstring>
#include <climits>
#include <algorithm>

using namespace std;
char a[5001],b[5001];
short int dp[2][5001];
int n;
int r1=0,r2=1,temp;
void cc()
{
    memset(dp[r1],0,sizeof(dp[r1]));
    temp=r1;
    r1=r2;
    r2=temp;
}

int solve()
{
    memset(dp,0,sizeof(dp));
    for(int i=n-1,j=0;i>=0;--i,++j)
        b[j] = a[i];
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
            if(*(a+i)==*(b+j))
                dp[r2][j+1]=dp[r1][j]+1;
            else
                dp[r2][j+1]=max(dp[r2][j],dp[r1][j+1]);
        cc();
    }
    return n-dp[r1][n];
}

int main()
{
   while(scanf("%d",&n)!=EOF)
   {
        scanf("%s",a);
        printf("%d\n",solve());
   }

    return 0;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1811次
    • 积分:352
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档