动态规划--前缀动态规划问题

最长公共子序列问题

问题定义:

输入:X = (x1,x2,…,xm) , Y = (y1,y2,…yn)

输出:公共子序列长度(拓展:如何打印公共子序列)

  1. 如何用子问题表示
    dp[ i ][ j ]表示X的i前缀与Y的j前缀的最长公共子序列长度
    则总问题==dp[ m ][ n ];

  2. 优化子结构和重叠子问题

  3. 递归表达式
    if X[ i ] == Y[ j ] ,则dp[ i ][ j ] = dp[ i-1 ][ j-1 ] + 1;
    else, 则dp[ i ][ j ] = max{ dp[ i-1 ][ j ] , dp[ i ][ j-1 ] }
    递归终点:dp[ i ][0]=dp[0][ j ]=0;(0<=i<m,0<=j<n)

  4. 设计数据结构:
    与编号动态规划问题不同的是,递归是二维的形式,则设计成二维数组

  5. 伪代码
    注意:对于这类二维动态规划,常常根据填表的方式(1)设计算法.(2)根据填表的顺序打印出序列
    确定填表方式
    在这里插入图片描述

1)最大长度

For i = 0 To m C[ i ][ 0 ] = 0;

For j = 0 To n C[ 0 ][ j ] = 0;

//根据填表过程设计循环(从左到右,从上到下)

For i = 1 To m

    For j = 1 To n

          if xi = yj

   
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值