动态规划之最长子序列(线性)
来源:互联网 发布:java虚拟主机管理系统 编辑:程序博客网 时间:2024/05/17 02:00
最近做了一个有关动态规划最长子序列有关的题,就看了一些有关的资料和博客!
以下是本人的一点小心得:
最长子序列分为不上升和不下降两种!代码的实现仅仅是一个大于号小于号的区别!
就拿最长不下降子序列来说,在这个序列中,例如:a[1,n];a1<=a2<=.......<=an-1<=an;
具体的实现:
用两个数组:a[],d[]; a[]用来储存序列中的数,d[]用来记录最长子序列的长度!
我们要做的就是,使a[x]尽可能的小,这样序列中后面的数值可以加进来的就尽可能的多!
动态方程:d[i]={d[j]+1&&a[i]>a[j]}
具体代码如下:
#include <stdio.h>#include <algorithm>using namespace std;int a[10001],d[10001];int main(){ int n; while(scanf("%d",&n)!=EOF) { int i,j; for(i=1;i<=n;++i) scanf("%d",&a[i]); for(i=1;i<=n;++i) { d[i]=1; for(j=1;j<i;++j) { if(a[j]<=a[i]&&d[j]+1>d[i]) d[i]=d[j]+1; } } sort(d+1,d+1+n); printf("%d\n",d[n]); } return 0;}
此代码的算法复杂度为:O(n*n);
在搜索序列中数据的时候,可以利用二分查找法,而不是一次次的遍历!
更优的代码算法复杂度为:O(n*logn);
- 动态规划之最长子序列(线性)
- 动态规划之线性动规(钢条切割、合唱队、最长递增子序列)
- 动态规划之最长公共子序列
- 动态规划之最长递增子序列
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- 动态规划之最长递增子序列
- 动态规划之最长公共子序列
- 动态规划之最长子序列
- 动态规划之最长公共子序列
- 动态规划之最长子序列问题
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- 动态规划之最长公共子序列
- CF—98A—Help Victoria the Wise
- 仓库和物品? 堆和栈!值类型和引用类型~~~~
- 指针和指针强制转换( 回忆版 )-------让初学者理解
- ATL_NO_VTABLE详解
- 设计模式(2)结合代码和例子来理解简单工厂模式
- 动态规划之最长子序列(线性)
- 附加数据库出错
- 完全卸载xcode
- allegro使用小技巧备忘录
- 项目2辅助学习练习2
- Java远程方法调用
- 13-01-26-->11
- 【三维树状数组与离散化】HDU 4267——A Simple Problem with Integers
- CFileDialog导致程序崩溃的解决方案