poj1159

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;
}



阅读更多
文章标签: poj DP 算法
个人分类: DP poj
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

poj1159

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭