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

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


动态规划

1.要素

动态规划两大要素:最优子结构、重叠子问题
最优子结构:当问题的最优解包含了其子问题的最优解时,该问题具有最优子结构性质
重叠子问题:在用递归算法自底向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算,具有子问题重叠性质。这类问题称重叠子问题

2.基本思想

将待求解问题分解成若干个子问题,先求解子问题,然后结合这些子问题的解得到原问题的解。求解的问题经分解得到的子问题往往不是相互独立的

3.适用于解最优化问题步骤

1)找出最优解的性质,并刻画其结果特征(分析最优解结构)
2)递归地定义最优解(建立递归关系)
3)以自底向上的方法计算得到的信息,构造最优解==(递归方式是自顶向下的,而动态规划算法是自底向上递归的)==(计算最优解)
4)根据计算最优值得到的信息,构造最优解(构造最优解)
1)2)3)为基本步骤


一、最长公共子序列?

最长公共子序列:X和Y的公共子序列中长度最长的(包含元素最多的)叫做X和Y的最长公共子序列
最长公共子序列:不唯一

二、解决问题

1.递归公式

在这里插入图片描述

代码如下(示例):

int **Lcs_length(string X,string Y,int **B)
{
	int x_len = X.length();
	int y_len = Y.length();
 
	int **C = new int *[x_len+1];
	for (int i = 0; i <= x_len; i++)
	{
		C[i] = new int[y_len + 1];        //定义一个存放最优解的值的表;
	}
 
	for (int i = 1; i <= x_len; i++)
	{
		C[i][0] = 0;
		B[i][0] = -2;                     //-2表示没有方向
	}
 
 
	for (int j = 0; j <= y_len; j++)
	{
		C[0][j] = 0;
		B[0][j] = -2;
	}
	
	for (int i = 1; i <= x_len; i++)
	{
		for (int j = 1; j <= y_len; j++)
		{
 
			if (X[i-1]==Y[j-1])
			{
				C[i][j] = C[i - 1][j - 1] + 1;
 
				B[i][j] = 0;             //0表示斜向左上
			}
			else
			{
				if (C[i-1][j]>=C[i][j-1])
				{
					C[i][j] = C[i - 1][j];
					B[i][j] = -1;       //-1表示竖直向上;
				}
				else
				{
					C[i][j] = C[i][j - 1];
					B[i][j] = 1;        //1表示横向左
				}
			}
 
		}
	}
	return C;
}

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值