zoukankan      html  css  js  c++  java
  • 动态规划 | 最长回文子串 1040

    部分正确(19分)代码:

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 2000
    #define MAX (1<<30)-1
    #define V vector<int>
    
    using namespace std;
    
    char s[LEN];
    int dp[LEN][LEN];
    
    int main(){
    //    freopen("I:\pat\动态规划\1040.txt","r",stdin);
        int n,i,j,v;
        gets(s);
        n=strlen(s);
        FF(i,n){
            dp[i][i]=1;
        }
        int ans=0;
        for(v=1;v<n;v++){
            for(i=0;i+v<n;i++){
                j=i+v;
                if(s[i]==s[j]){
                    dp[i][j]=dp[i+1][j-1]+2;
                }
                ans=max(ans,dp[i][j]);
            }
        }
        O("%d",ans);
        return 0;
    }
    View Code

    AC代码(按照算法笔记修改):

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <cstring>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 2000
    #define MAX (1<<30)-1
    #define V vector<int>
    
    using namespace std;
    
    char s[LEN];
    int dp[LEN][LEN];
    
    int main(){
    //    freopen("I:\pat\动态规划\1040.txt","r",stdin);
        int n,i,j,v,ans;
        gets(s);
        n=strlen(s);
        //边界 
        ans=1;
        FF(i,n){
            dp[i][i]=1;
            if(i<n-1 && s[i]==s[i+1]){
                 dp[i][i+1]=1;
                 ans=2;
            }
        }
        for(v=2;v<n;v++){
            for(i=0;i+v<n;i++){
                j=i+v;
                if(s[i]==s[j] && dp[i+1][j-1]==1){
                    dp[i][j]=1;
                    ans=v+1;
                }
            }
        }
        O("%d",ans);
        return 0;
    }
  • 相关阅读:
    【转】进程与线程的一个简单解释
    折半查找
    BOJ 89 统计时间间隔
    BOJ 88 最值问题
    BOJ 87 日期
    QT杂记(网上资料整理而成)
    我的博客园
    【制作镜像】virsh
    【培训】MySQL
    ERROR 1045 (28000): Access denied for user 'root'@'localhost'
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8572861.html
Copyright © 2011-2022 走看看