POJ 1458 Common Subsequence

本文介绍了一种使用动态规划(DP)方法解决求解两个字符串最长公共子串问题的经典算法实现。通过扫描两个字符串并利用DP表格记录中间结果,最终找出最长公共子串的长度。文章详细展示了算法的实现代码,包括初始化DP表格、状态转移方程及结果输出等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://poj.org/problem?id=1458

经典dp 将数组从下标1开始 可以不用特殊处理第一个数据

strlen(a+1) 而不是 strlen(a)

scanf 以 %s 形式 自动忽略空格 回车输入缓冲

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
const int maxn = 1000;
char a[maxn], b[maxn];
int dp[maxn][maxn];
int max(int a, int b)
{ return a>=b ?a :b ;  }
int main()
{    
    while(scanf("%s %s", a+1, b+1)!=EOF)
    {
        int lena = strlen(a+1);
        int lenb = strlen(b+1);
        memset(dp, 0, sizeof(dp));
        for(int i=1; i<=lena; i++)
            for(int j=1; j<=lenb; j++)
            {
                dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
                if( a[i] == b[j] )
                    dp[i][j] = max(dp[i][j], dp[i-1][j-1]+1);
            }
        printf("%d\n", dp[lena][lenb]);
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/crisxyj/archive/2013/03/03/2941792.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值