动态规划算法的入门教程:动态规划算法:(1)入门介绍及案例分析
接下来通过 最长公共子序列(LCS) 来加深对动态规划算法的理解。
1、问题描述:
2、思路分析:
3、代码:
- python写法:
if __name__ == "__main__":
A = input() # 第一个字符串
B = input() # 第二个字符串
dp = [[0 for _ in range(len(B)+1)] for _ in range(len(A)+1)] # 状态转移 初始化为0
# 边界,在初始化时已经为0,这里其实不用再定义边界,但是为了可读方便,这里加上
for i in range(len(A)+1):
dp[i][0] = 0
for j in range(len(B)+1):
dp[0][j] = 0
# 求解状态转移方程
for i in range(1, len(A)+1): # 从下标1开始,因为下标0是边界,已知
for j in range(1, len(B)+1):
if A[i-1] == B[j-1]: # 因为A,B下标都是从0开始的,所以都要-1
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
print("答案:", dp[len(A)][len(B)])
结果:
- C++写法:
#include <iostream>
using namespace std;
#include <algorithm>
#include <string>
int main()
{
const int N = 100;
string A, B;
cin >> A;
cin >> B;
int dp[N][N];
cout << A[A.size()];
//边界
for (int i = 0; i < A.size(); i++)
{
dp[i][0] = 0;
}
for (int j = 0; j < B.size(); j++)
{
dp[0][j] = 0;
}
//求解状态转移方程
for (int i = 1; i <= A.size(); i++)
{
for (int j = 1; j <= B.size(); j++)
{
if (A[i-1] == B[j-1]) // 因为A,B下标都是从0开始的,所以都要-1
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
else
{
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
}
}
}
cout << "答案:" << dp[A.size()][B.size()] << endl;
return 0;
}
结果:
4、总结:
动态规划算法的核心在于如何设计状态转移方程,而这也是动态规划算法最难的地方。