动态规划
递归型
记忆递归型
优点:只经过有用的状态,没有浪费。递推型会查看一些 没用的状态,有浪费。
缺点:可能会因递归层数太深导致栈溢出,函数调用带来额外时间开销。总体来说,比递推型慢
递推型
“人人为我”递推型(推荐):在选取最优备选状态的值Fm,Fn,…Fy时, 有可能有好的算法或数据结构可以用来显 著降低时间复杂度
“我为人人”递推型:没有什么明显的优势,有时比较符合思考的习惯。个别特殊题目中会比“人人为我”型节省空间
问题
最长上升子序列
百炼2757
思路:假设第k个元素为子序列的最后一个元素(1<=k<=n)。那么只要k前面小于k的元素对应的最长子序列加一,找到最大的那个。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n;
int i,j;
int A[1005],Max[1005];
cin >> n;
for (i=1; i<=n; i++)
{
cin >> A[i];
Max[i]=1; //每个元素,就算在它前面都比它大,那么它的最小长度就是它本身1
}
for (i=2; i<=n; i++) //求每次以i为终点的最长上升子系列长度
for(j=1;j<i;j++) //查看以第j个数为终点的最长上升子序列
if(A[i]>A[j])
Max[i]=max(Max[i],Max[j]+1);
cout << *max_element(Max+1,Max+n+1)<<'\\n';
return 0;
}

浙公网安备 33010602011771号