NYOJ308 Substring (DP)

题目意思:

http://acm.nyist.net/JudgeOnline/problem.php?pid=308

给定一个字符串s,求出s与其逆序串的最长连续字串。刚开始看成求最长回文字串的问题了,Wa~!这英语我也是醉了。。。喵

分析:

将s逆转为ss,求s和ss的最长连续子序列即可。

if(s[i-1]==ss[j-1]) dp[i][j]=dp[i-1][j-1]+1;

AC代码:

/**
  *@xiaoran
  *给定一个字符串s,求其和逆序串ss的最长连续公共子序列
  *dp[i][j]=dp[i-1][j-1]+1  当s[i-1]==ss[j-1]
  */
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cmath>
#define LL long long
using namespace std;
string rev(string s){//翻转字符串
    string ss="";
    for(int i=s.size()-1;i>=0;i--){
        ss+=s[i];
    }

    return ss;
}

int dp[55][55];
int main()
{
    int n,k,m;
    string s,ss;
    cin>>n;
    while(n--){
        memset(dp,0,sizeof(dp));
        cin>>s;
        ss=rev(s);
        k=0; m=0;
        for(int i=1;i<=s.size();i++){
            for(int j=1;j<=ss.size();j++){
                if(s[i-1]==ss[j-1]){
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                if(m<dp[i][j]){//当前值大于最大值的长度
                    m=dp[i][j];//更新最大长度值
                    k=i-1;//记录到哪儿结束
                }
            }
        }
        for(int i=k-m+1;i<=k;i++){
            cout<<s[i];
        }
        cout<<endl;
    }
    return 0;
}
时间: 2024-10-10 03:03:36

NYOJ308 Substring (DP)的相关文章

最长回文子串(Longest Palindromic Substring)-DP问题

问题描述: 给定一个字符串S,找出它的最大的回文子串,你可以假设字符串的最大长度是1000,而且存在唯一的最长回文子串 . 思路分析: 动态规划的思路:dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串. 则根据回文的规则我们可以知道: 如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1] 当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false. 动态规划的进行是按照字符串的长度从1 到 n推进的. DP算法实现: 1 packa

C# 文件去只读工具-线程-技术&amp;分享

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using Mysoft.Common.Multithread; namespace 除去只读 {

[Leetcode][JAVA] Word Break II

Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where each word is a valid dictionary word. Return all such possible sentences. For example, givens = "catsanddog",dict = ["cat", "cats"

(DP)3.Longest Substring Without Repeating Characters

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

Leetcode:【DP】Longest Palindromic Substring 解题报告

Longest Palindromic Substring -- HARD 级别 Question SolutionGiven 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. 经典的DP题目. 主页君给出3种解

LeetCode &quot;Longest Palindromic Substring&quot; - 1D DP

2D DP is an intuitive solution of course, but I got an MLE error, so I simplified it into a 1D DP: class Solution { public: void goDp(vector<int> &dp, int &maxLen, int &is, int &ie, int startLen, int len, string &s) { for(int ile

Codeforces 919D Substring (拓扑排序+树形dp)

题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个有向图构成一个环的时候就会使得值无限大,所以先用拓扑排序判断一下有没有环,如果有环直接输出-1, 如果没有环就再使用树形dp并记忆化存数,来找到最大值. 代码: 1 #include<cstring> 2 #include<iostream> 3 using namespace std

3.Longest Substring Without Repeating Characters(string; DP)

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest subst

UVa 11468 Substring (AC自动机+概率DP)

题意:给出一个字母表以及每个字母出现的概率.再给出一些模板串S.从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机,然后随机生成L个字母,就是在AC自动机的某个结点走多少步,dp[i][j] 表示在 i 结点,并且剩下 j 步, 然后记忆化搜索就OK了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <