zoukankan      html  css  js  c++  java
  • NYOJ 37 回文字符串

    回文字符串

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
     
    输入
    第一行给出整数N(0<N<100)
    接下来的N行,每行一个字符串,每个字符串长度不超过1000.
    输出
    每行输出所需添加的最少字符数
    样例输入
    1
    Ab3bd
    样例输出
    2
    来源
    IOI 2000
    上传者
    hzyqazasdf


    解题:很狠狠狠经典的dp题目啊。。。。叫什么来着?最长公共子序列。。。。。长度-最长公共子序列就是我们要的结果啊。。。。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <vector>
     6 #include <climits>
     7 #include <algorithm>
     8 #include <cmath>
     9 #define LL long long
    10 using namespace std;
    11 char a[1100],b[1100];
    12 int dp[2][1100];
    13 int main(){
    14     int ks,i,len,j;
    15     scanf("%d",&ks);
    16     while(ks--){
    17         scanf("%s",a);
    18         len = strlen(a);
    19         for(i = 0; i < len; i++)
    20             b[len-i-1] = a[i];
    21         b[len] = '';
    22         memset(dp,0,sizeof(dp));
    23         for(i = 1; i <= len; i++){
    24             for(j = 1; j <= len; j++){
    25                 if(a[i-1] == b[j-1]){
    26                     dp[i%2][j] = dp[(i-1)%2][j-1]+1;
    27                 }else dp[i%2][j] = max(dp[(i-1)%2][j],dp[i%2][j-1]);
    28             }
    29         }
    30         printf("%d
    ",len-dp[(i-1)%2][j-1]);
    31     }
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    论文尾注后无法插入分节符
    实现java对象排序的三种方式
    java数组的定义方式
    Canvas
    正则xss
    mongoDB学习记录
    查找,学习,记录
    地址
    node实战学习纪录
    nodejs学习记录
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/3847333.html
Copyright © 2011-2022 走看看