SDUTOJ. LCS问题.(DP)

动态规划+深度优先搜索+记忆化搜索(干货满满) 动态规划的定义 动态规划算法与分治法的思想类似,都是通过组合子问题的解来求原问题。我先来给大家介绍一下分治思想,分治思想就是把一个复杂的问题,分解为k个规模相同的子问题,如果还是无法解决,子问题又可以分为若干个相同规模的子问题求解,之后组合求原问题(难点)如二分法,归并排序,折半查找。至于动态规划:就是一个最优化问题,先将问题分解为子问题,并且对于这些分解的子问题自身就是最优的才能在这个基础上得出我们要解决的问题的最优方案(假设最优然后去求),要不然的话就能找到一个更优的解来替代这个解,得出新的最优自问题, 阅读详情

题目链接:

SDUTOJ1008


题目大意:

求N个串的最长最长公共子串。重点是N个,之前2个的话会求,N个变了下数量居然不会了……


解题过程:

  • 首先想到的是先求两个的LCS,LCS再与下一个串比较,直到比较完所有的串,显然这样是不对的。
  • 因为题目是N个串,之前求2个串直接嵌套循环就好了,现在N个的话就一脸懵逼了,于是想嵌套10个循环来着,最后放弃了。
  • 最后看了巨巨的博客(巨巨博客),才恍然大悟,说好的dp居然用dfs(然后下面的dp题也有好多就是dfs解的),不过把下标映射成一维数组也是学到了。
  • -

解题分析:

  • 首先题目说到了长度乘积不超过30000,也就差不多示意要把N个数组的状态映射成一维数组储存。
  • 下面是关于如何映射和状态方程(可耻的盗了图):
    这里写图片描述

AC代码:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int n;
string data[112];
int dp[31234], len[112];

int get_index()
{
    int result=len[0]-1;
    for (int i = 1; i < n; i++)
    {
        result = result * data[i].size() + len[i]-1;
    }
    return result;
}

int lcs()
{
    for (int i = 0; i < n; i++)
    {
        if (len[i] == 0)
            return 0;
    }

    int index = get_index();

    if (dp[index] >= 0)
    {
        return dp[index];
    }

    int flag = 1;
    for (int i = 1; i < n; i++)
    {
        if (data[i][len[i]-1] != data[0][len[0]-1])
        {
            flag = 0;
            break;
        }
    }

    int result;

    if (flag)
    {
        for (int i = 0; i < n; i++)
        {
            len[i]--;
        }
        result = lcs() + 1;
        for(int i = 0; i < n; i++)
        {
            len[i]++;
        }
    }
    else
    {
        result = 0;
        for (int i = 0; i < n; i++)
        {
            len[i]--;
            result = max(lcs(), result);
            len[i]++;
        }
    }
    dp[index] = result;
    return result;
}

int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        for (int i = 0; i < 110; i++)
        {
            data[i].clear();
        }

        memset(len, 0, sizeof(len));
        memset(dp, -1, sizeof(dp));
        cin >> n;
        for (int i = 0;i < n; i++)
        {
            cin >> data[i];
            len[i] = data[i].size();
        }

        cout << lcs() << endl;
    }
}

依次取LCS方法(错误):

既然写了就放出了玩玩好了,谁知道什么时候能用到呢。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;

string max_len(string a, string b)
{
    if (a.size() > b.size())
        return a;
    else
        return b;
}

string find_lcs(string a, string b)
{
    string data[112][112];
    int i, j;

    for (i = 0; i < 112; i++)
    {
        for (j = 0; j < 112; j++)
        {
            data[i][j].clear();
        }
    }


    for (i = 1; i <= a.size(); i++)
    {
        for (j = 1; j <= b.size(); j++)
        {
            if (a[i-1] == b[j-1])
            {
                data[i][j] = data[i-1][j-1] + a[i-1];
            }
            else
            {
                data[i][j] = max_len(data[i-1][j], data[i][j-1]);
            }
        }
    }
    return data[a.size()][b.size()];
}

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int n;
        string str, result;
        cin >> n;
        cin >> result;
        n--;
        while (n--)
        {
            cin >> str;
            result = find_lcs(result, str);
        }
        cout << result.size() << endl;
    }
}
sdut 1008 最大公共字串 最大公共子串 Time Limit: 1000MS Memory limit: 32768K 题目描述 从一个给定的串中删去(不一定连续地删去)0个或0个以上的字符,剩下地字符按原来顺序组成的串。例如:“ ”,“a”,“xb”,“aaa”,“bbb”,“xabb”,“xaaabbb”都是串“xaaabbb”的子串。(例子中的串不包含引号。) 编程求N个非空串的最长公共子串 阅读详情

相关推荐

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程,解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响,每N分频,TIE RJ(1𝜎)不变(之前已推导),而Period RJ(1𝜎)增加√N倍。

u010486560的博客 2038

LCS算法

<br /><br />首先将要看到如何运用动态编程查找两个 DNA 序列的最长公共子序列(longest common subsequence,LCS)。发现了新的基因序列的生物学家通常想知道该基因序列与其他哪个序列最相似。查找 LCS 是计算两个序列相似程度的一种方法:LCS 越长,两个序列越相似。<br />子序列中的字符与子字符串中的字符不同,它们不需要是连续的。例如,ACE 是 ABCDE 的子序列,但不是它的子字符串。请看下面两个 DNA 序列:S1 = DE>GCCCTAGCGDE>S2 = 

leohxj的专栏 2万+

白话详细解读(七)----- CBAM:Convolutional Block Attention Module

一、CBAM简介 论文链接:https://x.sci-hub.org.cn/scholar?hl=zh-TW&as_sdt=0%2C5&q=CBAM%3A+Convolutional+Block+Attention+Module&btnG=&oq=CB CBAM这篇论文是在2018年提出的,自提出之后,已经被引用上千次,可见其影响力。CBAM是一种专门为了卷积神经网络而设计的注意力模块,传统的卷积存在只关注局部信息,而往往忽略全局信息的弊端,以3*3卷积为例,滤波器有9个

奋斗の博客 1万+

LCS

给定俩个序列X,Y,求出俩序列中最长公共子序列,子序列可以是不连续的。拿到这样的问题,如果使用暴力法,是枚举出X所有的子序列,判断子序列是否为Y的子序列,然后再从所有的子序列中找出长度最长的。这样做的话,时间复杂度为O(2^N),时间复杂度太高。在这种通过暴力法解决时,时间复杂度过高的情况下,我们可以考虑动态规划法。 序列: X={x1,x2,,,xn} Y={y1,y2,,,ym}...

Demodan的博客 1135

安装esxi7.0

保存重启后就能安装。vCenter Server是VMware vSphere虚拟化架构中的核心管理工具,充当ESXi主机及虚拟机中心管理点的服务,利用vCenter Server,可以集中管理多ESXi主机及其虚拟机,安装、配置和管理vCenter Server 不当可能会导致管理效率降低,或者致使EXSi主机和虚拟机停用。提示选择安装VMware ESXi 使用的存储,ESXi支持U盘以及SD卡安装,如系统中存在多块存储设备,选择需要安装系统的磁盘【注意磁盘142G,ESXI会将120G做VMFSL】

u011220233的博客 1万+

AI 代码生成工具的质量评估体系

基础需求层包括响应速度(Response Time)和界面友好性(UI Friendliness),期望需求层涵盖智能提示(Smart Suggestions)和个性化配置(Personalization),兴奋需求层则涉及多模态交互(Multimodal Interaction)和代码进化(Code Evolution)。在金融领域,代码审计合规性(Compliance Audit)权重应提升至40%,而在Web开发中,API兼容性(API Compatibility)的权重需达到35%。

2503_92418637的博客 3372

动态规划解最长公共子序列(LCS)问题 (附可打印LCS完整代码)

动态规划法 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。 为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。 【问题】 求两字符序列的最长公共字

AC,∑ndless 9136

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

最长公共子串和最长公共子序列问题python

动态规划      和分治法一样,动态规划(dynamic programming)是通过组合子问题而解决整个问题的解。      分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解。      动态规划适用于子问题不是独立的情况,也就是各子问题包含公共的子子问题。      此时,分治法会做许多不必要的工作,即重复地求解公共的子问题。动态规划算法对每个子问题只求...

miner_zhu的博客 921

高通SDX12:ProSLIC Si32185移植调试

高通 SDX12 语音芯片slic 音频驱动 Si32185

不秃头的程序猿Gabriel的博客 2038

uniapp - 解决 uni.chooseImage 在苹果 IOS 真机上点击没反应的问题,苹果手机点击 uni.chooseImage方法不生效,也不报任何错误(解决苹果ios系统点击无效问题)

uniapp小程序h5网页苹果ios系统点击uni.chooseImage不执行点击无效,uniapp使用uni.chooseImage方法点击没反应怎么办,uniappuni.chooseImage在ios苹果手机运行点击不触发,uniappuni.chooseImage苹果ios系统点击无效,uniapp项目ios端云打包之后uni.chooseImage不生效了,uniapp打包之后uni.chooseImage()无法打开相机,uniapp苹果手机无法打开相机和相册,uniapp网页h5微信支

🏆 前端领域优质创作者 1万+

SDUTOJ 2080 最长公共子序列问题(LCS)

题目描述  给定两个序列X= 输入 输入数据有多组,每组有两行 ,每行为一个长度不超过500的字符串(输入全是大写英文字母(A,Z)),表示序列X和Y。 输出 每组输出一行,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出0。 示例输入 ABCBDAB BDCABA 示例输出 4 #include #include #includ

Grit_ICPC的博客 614

cesium 气象云(体积云)

本文介绍了基于Cesium的气象云渲染技术方案,其核心是通过GPU加速的光线投射算法实现气象云的三维可视化。方案采用分层架构设计:GPU计算层由顶点着色器和片段着色器组成,负责光线投射计算、3D纹理采样和颜色映射;CPU控制层处理数据预处理、纹理创建和参数配置。关键技术包括:顶点着色器计算相机位置和光线方向,片段着色器实现光线步进采样、颜色映射和半透明混合。该方案高效解决了气象数据与地理场景的融合问题,支持云图、温度场等复杂三维气象数据的实时渲染,具有高真实感和良好性能。

God's asylum的博客 1201

动态规划——最长公共子序列

SDUT OJ G题 这是最长的 恩 对 #include <stdio.h> #include <stdlib.h> #include <string.h> int max2(int a,int b) { if(a>b) return a; else return b; } int min2(int a,int b) { ...

wjt_1025的博客 390

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

HZAUoj 1015: LCS 【LCS变形】 + 1016: Array C 【贪心】

真是SB,20多个人花了6个小时顶着太阳去爬山,结果还没到顶,真心不如在机房打代码。题目链接:HZAUoj 1015: LCS 题意:给定两个字符串a和b,让你找它们特殊的LCS——该LCS在a、b原串中任一连续段长度不小于k。问你最长的LCS。 思路:考虑dpdp 设置End[i][j]End[i][j]表示以a[i]、b[j]结尾的串的最大连续段长度。 设置dp[i][j]dp[i][j

世界很大 721

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

哈理工OJ—1598【DP最长公共子序列O(nlogn)】

哈理工1598-序列问题III Description 有俩个长度分别为p和q的序列A和B,每个序列的各个元素互不相同,且每个元素的大小都是1~(p和q中的最大值)之间的正整数。 俩个序列的第一个元素都为1,求出A和B的最长公共子序列长度。 Input 输入第一行为数据组数T(T&lt;=20)。每组数据包括3行,第一行为2个整数p和q(1&lt;=p,q&lt;=10000), 第二...

lhc----- 963

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ACM模板——LCS

代码如下: #include #include using namespace std; int v[1000][1000]; short dir[1000][1000]; char A[1000],B[1000]; int r,c; int LCS() { for(int i=1;i<=r;i++) for

结构之美 算法之道 2291

汉诺塔系列2

汉诺塔系列2 Time Limit: 1000MS Memory limit: 65536K 题目描述 用1,2,...,n表示n个盘子,称为1号盘,2号盘,...。号数大盘子就大。经典的汉诺塔问 题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于 印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小 顺序摞着6

sdut_jean的博客 1498

HZAUoj 1015: LCS (LCS变形)

1015: LCS Time Limit: 1 Sec Memory Limit: 128 MB Description Giving two strings consists of only lowercase letters, find the LCS(Longest Common Subsequence) whose all partition are not less th

qq_35634181的博客 305

LCS问题

分为递归和动态规划两种求解方法。 //递归求解 private static int lcs(String one,String two){ int n = 0; int m = 0; int length = 0; while(one.length()!= 0 && two.length()!= 0)...

weixin_30807779的博客 164

南阳OJ36-最长公共子序列(LCS)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。 tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合

Eric_keke的专栏 899

sdut 1008 最大公共子串(求n个字符串的最长公共子串)lcs

原题:最长公共字符串 可以看看这个博主写的 sdut 1008 最大公共字串 我等弱渣只能加个注释学习学习。。 #include #include #include #include using namespace std; int leftup=1,left=2,up=3; int sum[110][110]; int pt[11

胡七一upup 1708

LCS(最长公共子序列)和dp(动态规划)

参照:v_JULY_v        最长公共子序列定义:         注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列;更简略地说,前者(子串

寻找、发现、追求、获得———这就是狼的生活要素 3925

HDU2196 - Computer(树的直径+DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196题目大意:给定一个无向连通无环图,求每个节点到达的最远的节点的距离。解题过程:上午看了一下DP进阶之路的PDF,突然想学树型DP。然后找到了这个题,之前做了一个POJ的BFS求树的直径的,这次再来一发DP的。题目分析:由于题目给的是无向连通无环图,这里构造出一颗树来,不妨假设节点11为根。那么对于任

ACM_Fish的博客 817
上一篇: CodeForces 255C. Almost Arithmetical Progression (DP)
下一篇: HDOJ1176. 免费馅饼.(DP)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值