zoukankan      html  css  js  c++  java
  • POJ 1159 Palindrome yongmou

    题意:插入字符来得到回文串,求插入字符最小数目

    思路:递归方程dp[i][j], 下来三者的最小值:如果str[i] 等于 str[j] 时 dp[i+1][j-1]; dp[i+1][j] + 1(在str[j]后面插入一个与str[i]相同的字符); dp[i][j-1] +1(在str[i]前面插入一个与str[j]相同的字符)。子问题填表,从(0,0)到(n, n)对角线向上填。

    代码:

    #include<cstdio>
    using namespace std;

    const int MAX = 5000;
    int len;
    char str[MAX+4];
    short dp[MAX][MAX];

    int process(){
    int i, j;
    int min;
    for(int k=1; k<len; ++k){
    for(i=0, j=k; i<len-k; ++i, ++j){
    min
    = ((dp[i][j-1] < dp[i+1][j]) ? dp[i][j-1] : dp[i+1][j]) + 1;
    if(str[i] == str[j] && min > dp[i+1][j-1])
    min
    = dp[i+1][j-1];
    dp[i][j]
    = min;
    }
    }
    return dp[0][len-1];
    }
    int main(){
    // freopen("in", "r", stdin);

    int min;
    while(scanf("%d", &len) != EOF){
    scanf(
    "%s", str);
    min
    = process();
    printf(
    "%d\n", min);
    }
    return 0;
    }
  • 相关阅读:
    指针和数组的关系
    深入学习数组
    const关键字与指针
    野指针是什么
    指针带来的一些符号的理解
    指针的本质
    内存管理之堆
    内存管理之栈
    元类
    断点调式和面向对象进阶
  • 原文地址:https://www.cnblogs.com/liyongmou/p/1774022.html
Copyright © 2011-2022 走看看