zoukankan      html  css  js  c++  java
  • 区间DP UVA 10453 Make Palindrome

    题目传送门

     1 /*
     2     题意:问最少插入多少个字符使得字符串变成回文串
     3     区间DP:dp[i][j]表示[l, r]的字符串要成为回文需要插入几个字符串,那么dp[l][r] = dp[l+1][r-1]; (str[l] == str[r])
     4             dp[l][r] = min (dp[l+1][r], dp[l][r-1]) + 1,然后按照状态转移递归输出路径
     5 */
     6 /************************************************
     7 * Author        :Running_Time
     8 * Created Time  :2015-8-17 14:42:57
     9 * File Name     :UVA_10453.cpp
    10  ************************************************/
    11 
    12 #include <cstdio>
    13 #include <algorithm>
    14 #include <iostream>
    15 #include <sstream>
    16 #include <cstring>
    17 #include <cmath>
    18 #include <string>
    19 #include <vector>
    20 #include <queue>
    21 #include <deque>
    22 #include <stack>
    23 #include <list>
    24 #include <map>
    25 #include <set>
    26 #include <bitset>
    27 #include <cstdlib>
    28 #include <ctime>
    29 using namespace std;
    30 
    31 #define lson l, mid, rt << 1
    32 #define rson mid + 1, r, rt << 1 | 1
    33 typedef long long ll;
    34 const int MAXN = 1e3 + 10;
    35 const int INF = 0x3f3f3f3f;
    36 const int MOD = 1e9 + 7;
    37 char str[MAXN];
    38 int dp[MAXN][MAXN];
    39 
    40 void print(int l, int r)    {
    41     if (l > r)  return ;
    42     if (l == r) printf ("%c", str[l]);
    43     else if (str[l] == str[r])   {
    44         printf ("%c", str[l]);
    45         print (l + 1, r - 1);
    46         printf ("%c", str[l]);
    47     }
    48     else if (dp[l][r] == dp[l+1][r] + 1)    {
    49         printf ("%c", str[l]);
    50         print (l + 1, r);
    51         printf ("%c", str[l]);
    52     }
    53     else    {
    54         printf ("%c", str[r]);
    55         print (l, r - 1);
    56         printf ("%c", str[r]);
    57     }
    58 }
    59 
    60 void work(void) {
    61     memset (dp, 0, sizeof (dp));
    62     int len = strlen (str);
    63     for (int i=2; i<=len; ++i)  {
    64         for (int j=0; j+i-1<len; ++j)   {
    65             int k = j + i - 1;
    66             int &res = dp[j][k] = INF;
    67             if (str[j] == str[k])   res = dp[j+1][k-1];
    68             res = min (res, min (dp[j+1][k], dp[j][k-1]) + 1);
    69         }
    70     }
    71     printf ("%d ", dp[0][len-1]);
    72     print (0, len - 1); puts ("");
    73 }
    74 
    75 int main(void)    {     //UVA 10453 Make Palindrome
    76     while (scanf ("%s", str) == 1)  {
    77         work ();
    78     }
    79 
    80     return 0;
    81 }
    编译人生,运行世界!
  • 相关阅读:
    Java 理论与实践: 正确使用 Volatile 变量
    VS2005 C++,断点无法命中的解决办法
    IndexWriterConfig的各个配置项说明(转)
    LINQ&Entity Framework
    CDN
    德鲁克之沟通的四原则
    项目管理过程之项目团队
    OOAD & OOP
    双线接入(全网路由)简单介绍
    唐僧为什么可以领导孙悟空
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4736726.html
Copyright © 2011-2022 走看看