动态规划求最长公共子序列
动态规划
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提供了大量能使我们快速便捷地处理数据的函数和方法。