动态规划 | 最长回文子串 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;
}

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;
}

原文地址:https://www.cnblogs.com/TQCAI/p/8572861.html

时间: 2024-11-10 18:06:12

动态规划 | 最长回文子串 1040的相关文章

[动态规划]最长回文子串

问题描述: 求一个字符串的最长回文子串,返回这个子串. 这个题目适合用动态规划的方式求解: 代码实现: string longestPalindrome(string s) { int size = s.size(); int dp[1000][1000] = {0}; int left = 0; int right = 0; int len = 0; for(int j = 0; j < size; ++j) { for(int i = 0; i < j; ++i) { if(j - i &

动态规划——最长回文子串

最长回文子串的问题描述: 下面介绍动态规划的方法,使用动态规划可以达到最优的 O(n2) 复杂度. 令 dp[i][j] 表示 S[i] 至 S[j] 所表示的子串是否是回文子串,是则为 1,不是则为 0.这样根据 S[i] 是否等于 S[j] ,可以把转移情况分为两类: 若 S[i] == S[j],那么只要 S[i+1] 至 S[j-1] 是回文子串,S[i] 至 S[j] 就是回文子串:如果S[i+1] 至 S[j-1] 不是回文子串,则 S[i] 至 S[j] 也不是回文子串. 若 S[

【数据结构与算法】动态规划——最长回文子串

最长回文子串 LeetCode:最长回文子串 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 思想: 动态规划,用boolean[][] dp记录每一对字符是否相等: 双循环遍历所有子串情况,每次遍历时,当前子串首尾相等且内层-1字符串dp值为true,则记录dp值为true:全部遍历完,取最长,即为最

动态规划—最长回文子串LEETCODE第5题深度剖析

动态规划对于笔者来说有很重要的意义 一.题目如下: 对于此类题目,笔者常用的的办法是先做个暴力解题思路,然后再对暴力法进行优化. 二.暴力法 //字串遍历 public static String longestPalindrome(String s) { String result=""; if(s.length()==1) return s; for(int i=0;i<s.length();i++) { for(int j=i+1;j<s.length()+1;j++

Leetcode-最长回文子串(包含动态规划以及Manacher算法)

原文地址: https://www.cnblogs.com/mini-coconut/p/9074315.html 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案. 示例 2: 输入: "cbbd" 输出: "bb" 自己的思路:求一个字符串的最长回文子串,我们可以将以每个字符

leetcode-5 最长回文子串(动态规划)

题目要求: * 给定字符串,求解最长回文子串 * 字符串最长为1000 * 存在独一无二的最长回文字符串 求解思路: * 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串, * 那么P[i+1,j-1]也是回文字符串.这样最长回文子串就能分解成一系列子问题了. * 这样需要额外的空间O(N^2),算法复杂度也是O(N^2). * 首先定义状态方程和转移方程: * P[i,j]=0表示子串[i,j]不是回文串.P[i,j]=1表示子串[i,j]是回文串. * P

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

(算法)最长回文子串

题目: 求一个字符串的最长回文子串 思路: 1.暴力枚举 最容易想到的就是暴力破解,列举每一个子串,然后根据回文的定义判断是不是回文,找到最长的那个. 求每一个子串的时间复杂度为O(N^2),判断子串是不是回文的时间复杂度为O(N),所以时间复杂度为O(N^3). 2.动态规划 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文字符串,那么P[i+1,j-1]也是回文字符串.这样最长回文子串就能分解成一系列子问题了. 这样需要额外的空间是O(N^2),时间复杂度也是O

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=