zoukankan      html  css  js  c++  java
  • [ACM_动态规划] Palindrome

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28415#problem/D

     

    题目大意:给一个长为n的字符串,问最少插入几个字符成回文串

    解题思路:总长-最长公共(原来的和其倒过来的串)子序列(LCS) 

    知识详解——LCS:给出两个子序列A,B,求长度最大的公共子序列(如152687和2356984——>568或268);不妨设d(i,j)为A,B的LCS,   则最有子结构为::A[i]=B[j]时,d(i,j)=d(i-1,j-1)+1;否则,d(i,j)=max{d(i-1,j),d(i,j-1)};复杂度为O(m*n),也可用滚动数组法优化。

    #include<iostream>
    #include<cmath>
    #include<string>
    #include<algorithm>
    using namespace std;
    int c[5005][5005]; 
    int main(){
        int n; 
        for(string a,b;cin>>n>>a;){  
           
           b=a;                      //输入a并获得其颠到序列+对c[][]初始化0
           reverse(b.begin(),b.end());
           memset(c,0,sizeof(c));
    
           for(int j=0;j<n;j++){     //利用最优子结构求解过程
              for(int i=0; i<n; i++){  
                   if(a[i]==b[j])  c[i+1][j+1]=c[i][j]+1;  
                   else   c[i+1][j+1] = c[i][j+1]>c[i+1][j] ? c[i][j+1]:c[i+1][j];  
               }
           }  
    
           cout<<n-c[n][n]<<endl;
        }
        return 0;
    }
    View Code
    注意: 上面的代码虽然实现了求解,但是 由于开了一个c[2005][2005]的数组所以不幸Memory Limit Exceeded”,通过观察不难发

    其最优子结构中每次计算只用到两层数据,因此可以考录建立一个c[2][2005]的动态表来节省空间,代码如下:
    #include<iostream>
    #include<cmath>
    #include<string>
    #include<algorithm>
    using namespace std;
    int c[2][5005];//开一个2层的数组,0层存先前数值,1层存当前数值,每次计算完一层要用1层更新0层  
    int main(){
        int n; 
    
        for(string a,b;cin>>n>>a;){  
           
           b=a;
           reverse(b.begin(),b.end());
           memset(c,0,sizeof(c));
    
           for(int j=0;j<n;j++){ 
    
              for(int i=0; i<n; i++){                  //用前一层计算下一层  
                   if(a[i]==b[j])  c[1][i+1]=c[0][i]+1;  
                   else   c[1][i+1] = c[1][i]>c[0][i+1] ? c[1][i]:c[0][i+1];  
              }  
              for(int i=1; i<=n; i++) c[0][i]=c[1][i]; //每次计算完一层要用1层更新0层  
           }  
    
           cout<<n-c[1][n]<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Docker学习笔记-Redis 安装
    CentOS搭建FTP服务
    Docker学习笔记-Docker for Windows 安装
    Docker学习笔记-Docker for Linux 安装
    (转载)Javascript 中的非空判断 undefined,null, NaN的区别
    MongoDB
    RabbitMQ
    GIT学习笔记——常用命令
    Evanyou Blog 彩带
    Evanyou Blog 彩带
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3245558.html
Copyright © 2011-2022 走看看