可以用dp处理的问题:重叠子问题(计算大问题的时候 要多次计算小问题) , 最优子结构
难点:设计好dp的状态方程
设置所求的答案为数组dp[ ] [ ];
一维数组/二维数组 = ?以前的递归
题目描述:小蓝要走楼梯,他一次可以走 1 个台阶或者2 个台阶,问走到第 n 个台阶时,一共有多少种走法?
dp[n]为走到第n个台阶时的走
最长子序列:元素在A,B中都有,且在AB中出现的先后顺序一样
给定一个长度为 N 数组 a 和一个长度为 M 的数组 b。
请你求出它们的最长公共子序列长度为多少。
两个循环遍历a,b数组,
两种情况:1.当a,b数组的元素相同时,之前的状态加1;
2.元素不同时,
#include<bits/stdc++.h>
using namespace std;
int dp[1000][1000],A[1000],B[1000];
int main()
{
int N,M;
cin>>N>>M;
for(int i=1;i<=N;i++)
cin>>A[i];
for(int j=1;j<=M;j++)
cin>>B[j];
for(int i=1;i<=N;i++)
for(int j=1;j<=M;j++)
{
if(A[i]==B[j]){ //则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]);
}
}
cout << dp[N][M];
}