HDUOJ 1159

来源:互联网 发布:ubuntu mongodb安装 编辑:程序博客网 时间:2024/06/03 20:38

原题

  • Problem Description

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, …, xm> another sequence Z = < z1, z2, …, zk> is a subsequence of X if there exists a strictly increasing sequence < i1, i2, …, ik> of indices of X such that for all j = 1,2,…,k, xij = zj. For example, Z = < a, b, f, c> is a subsequence of X = < a, b, c, f, b, c> with index sequence < 1, 2, 4, 6>. Given two sequences X and Y the problem is to find the length of the maximum-length common subsequence of X and Y.
    The program…….

  • Sample Input

    abcfbc abfcab
    programming contest
    abcd mnp

  • Sample Output

    4
    2
    0

解题思路:

这里写图片描述

  • 可以把c[ i ][ j ]理解成:取X的前i个字符和取Y的前j个字符,能得到的LCS值
  • 分为一下两类:
    • 如果X的第i个字符X[ i ] 等于 Y的第j个字符Y[ j ]
    • 如果X的第i个字符X[ i ] 不等于 Y的第j个字符Y[ j ]

引进一个二维数组c[ ][ ],用c[ i ][ j ]记录X[ i ]与Y[ j ] 的LCS 的长度。
我们是自底向上从小到大进行递推计算,所以就能在在计算c[ i ][ j ]之前,把c[ i-1 ][ j-1 ],c[ i-1 ][ j ]与c[ i ][ j-1 ]计算出来,此时我们根据X[ i ] = Y[ j ]还是X[ i ] != Y[ j ],就可以计算出c[ i ][ j ]。

代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int dp[1000][1000];char a[1000], b[1000];int main(){    int a_length, b_length, maxLength, i, j;    while (scanf("%s%s",a + 1,b + 1)!=EOF)//0位不存    {        a[0] = b[0] = '*';//无用--只是方便下面数组循环无需减一加一操作        a_length = strlen(a);        b_length = strlen(b);        maxLength = max(a_length, b_length);        for (i = 0; i <= maxLength; i++)            dp[i][0] = dp[0][i] = 0;//初始化        for (i = 1; i < a_length; i++)//动态规划            for (j = 1; j < b_length; j++)                if (a[i] == b[j])dp[i][j] = dp[i - 1][j - 1] + 1;                else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);        printf("%d\n", dp[i - 1][j - 1]);    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 新办号码有微信怎么办 两手机互换号后微信怎么办 手机申请不了qq怎么办 快手账号保护了怎么办 qq号过期登不上怎么办 xp 登陆界面不见了怎么办 手机号qq 别人登录怎么办 qq号申请频繁怎么办 qq号实名验证怎么办 陌陌没法注册怎么办 腾讯q币充值错误怎么办 手机号码注册微信号怎么办 q币充错了号怎么办 微信超额度提现都不可以怎么办 微信发红包转账限额怎么办 银行卡没设密码怎么办 宜人贷逾期一天怎么办 快手实名已认证怎么办 爱奇艺充会员没有银行卡怎么办 手机qq内存太大怎么办 借呗逾期半年怎么办 支付宝支付错误怎么办 小米6支付宝闪退怎么办 验证码发送失败怎么办 支付宝升级后打不开怎么办 steam支付宝失败怎么办 支付宝无响应怎么办 花呗加载失败怎么办 吃鸡平台无效怎么办 悦支付登录不了怎么办 微信里的钱超额怎么办 qq不能发红包怎么办 qq红包多发了怎么办 qq红包领不了怎么办 qq红包密码忘记怎么办 钱包锁密码忘记怎么办 支付宝红包过期怎么办 qq红包无法领取怎么办 qq红包未领取怎么办 支付宝转账超时怎么办 电脑显示没信号怎么办