关闭

poj1159

标签: pojDP算法
66人阅读 评论(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网站的观点或立场

poj1159 动态规划

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 45846   Accepted: 15629 ...
  • LanQiuChaoRen
  • LanQiuChaoRen
  • 2013-03-24 16:04
  • 362

poj1159(回文字串)

Palindrome Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 41514 Accepted: 14146 Description A palindrome is a symmetrical stri...
  • lanjiangzhou
  • lanjiangzhou
  • 2013-05-30 10:50
  • 347

每日一题(18): poj1159

1. 自己思考思路的时候开始觉得用动态规划,但是想不出公式。后来觉得如果把输入的字符串反过来,然后和原来的字符串相比求最大序列,然后答案就是原来的序列减去最大序列了。因为无法匹配的肯定需要添加。可以匹配的话就一定会出现在最大序列里面。这可以用反证法证明。解决了方法的问题。下面就是代码。其实就是一个最...
  • kaka0930
  • kaka0930
  • 2016-12-02 10:02
  • 159

poj1159(类LCS的转移方程)

/* translation: 给出一串字符串,求最少插入几个字符才能形成回文串。 solution: 基本dp,LCS类转移方程 思路很简单,将原字符串及其反串求LCS,将原本字符串长度减去LCS长度就是答案。 状态定义和转移方程都和LCS一样。 note: 该题目需要用滚动数组,不...
  • qq_29169749
  • qq_29169749
  • 2016-08-20 17:48
  • 142

poj1159(dp,最长公共子序列)

题目的大概意思就是给你一个字符串,然后可以往字符串里面插入字符,要计算出至少插入多少个字符,可以让它形成一个回文串。   做法就是生成一个新串,该新串是原串的逆序串,然后求两个串的最长公共子序列就好。   动归方程:   dp[i][j] = max( dp[i-1][...
  • kevin_liu11
  • kevin_liu11
  • 2015-06-09 16:44
  • 169

POJ1159——Palindrome——DP+滚动数组(节省空间)

Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 52154   Accepted: 17973 ...
  • tcherry
  • tcherry
  • 2014-07-23 22:28
  • 332

POJ1159回文字符串(DP+滚动数组)

题目的大概意思就是给你一个字符串,让你在任意位置添加任意字符让它变成一个回文字符串,求最少添加的字符数。 这是一道典型的DP,总体思路就是把逆串搞出来,两个字符串求出一个最大公共子序列的长度,然后拿n减去这个长度就可以了。 一开始想直接开二维的DP数组,结果发现5000的长度会爆。网上学了用一个滚...
  • agenthtb
  • agenthtb
  • 2016-08-05 10:32
  • 98

POJ1159 Palindrome(最大回文串长度)

回文串:给一个串,求最少增添几个字符能使之成为回文串 例如:Ab3bd 首尾增添2个d A  成为Adb3bdA 或dAb3bAd 解法:动态规划; 1)和杭电多校一题统计回文串的题很像,考虑能不能直接套用; 2)还是先从动态规划的基本元素分析吧; 设状态...
  • lilinshi
  • lilinshi
  • 2013-08-13 00:37
  • 352

poj1159(回文串+LCS+滚动数组)

题目链接:poj1159 /* 题目大意: 给一串字符,问最少添加几个字符能使这个字符串变成回文字符串 思路: 添加字符数 = 原串字符数 - 原串和其逆串的最长公共子序列的长度 然后就是用滚动数组求最长公共子序列,在0~1行之间滚动,滚动表达式为i&和(i-1)&...
  • u010728156
  • u010728156
  • 2014-03-26 11:22
  • 609

POJ1159 回文串DP与MTE,滚动数组

题意: 输入一串字符串,插入一些字符使这个字符串变成回文串,求插入字符个数的最小值 要点: 可以这么看,设字符串为C1,C2,C3……Cn,如果C1==Cn,那么只要再考虑C2是否等于Cn-1即可,如果不相等,有下列两种选择: 在串后加C1'==C1,即C1,C2……Cn,C1',那...
  • SeasonJoe
  • SeasonJoe
  • 2015-12-27 13:55
  • 287
    个人资料
    • 访问:2868次
    • 积分:356
    • 等级:
    • 排名:千里之外
    • 原创:35篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档