动态规划基础
参考资料
最长上升子序列
最长上升子序列(Longest Increasing Subsequence,LIS)指找到给定序列的一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能大。
- 动态规划
- 二分查找
- 树状数组
for(int i=1;i<=n;i++)
{
f[i]=1;
for(int j=1;j<i;j++)
{
if(a[j]<a[i])f[i]=max(f[i],f[j]+1);
}
ans=max(ans,f[i]);
}
for(int i=1;i<=n;i++)
{
int k=lower_bound(b+1,b+n+1,a[i])-b;
b[k]=a[i];
ans=max(ans,k);
}
for(int i=1;i<=n;i++)
{
int k=query(a[i]-1)+1;
update(a[i],k);
ans=max(ans,k);
}
例题
给定一个长度为 的正整数序列 ,求最长上升子序列的长度。()
给定一个 行的数字三角形(),需要找到一条从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到当前点左下方的点或右下方的点。在下面这个示例中,最优路径是 。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5