最长递增子序列长度(动态规划)
来源:互联网 发布:gps导航软件下载 编辑:程序博客网 时间:2024/06/08 14:53
状态方程:
MaxLen (1) = 1
MaxLen (k) = Max { MaxLen (i)+1:1<i < k 且 ai < ak }(取所有MaxLen里面最大那个拿出来当最长子序列的长度)
当然丢出一个状态方程可能会比较懵逼,讲道理过一段时间我再回来看可能也会懵逼,所以我得举一个小例子来讲一下
其实MaxLen记录的是这一个数的时候他的递增子序列的长度是多少,然后最后取最长的就ok了
代码:
#include <stdio.h> #include <iostream> #define MAX 1000 int seq[MAX+10]; int seqlen[MAX+10]; int main() { int i,j,k,N,max,maxlen=1; scanf("%d",&N); for(i=1;i<=N;i++) seqlen[i]=1; //seqlen数组存以第i个数为终点的最长上升序列 ,首先现在把他们全部赋1的意思就是还没计数的时候就算自己本身就是1 for(i=1;i<=N;i++) scanf("%d",&seq[i]); //seq数组保存序列数组 for (i=2;i<=N;i++) { max=0; for (j=1;j<=i-1;j++) { if(seq[j]<seq[i]&&seqlen[j]>max) //在前i-1个序列中,寻找以终点小于seq[i]的最长的子序列,即最优子状态 判断条件,前一个的值小于后一个,然后i这个点的值设为j点的值加一 max=seqlen[j]; } seqlen[i]=max+1; if(seqlen[i]>maxlen) //seqlen中保存的是第i个数为终点的最长上升序列,找出这个数组中最大的值即为最优序列长度 这里就是找最大的那个点 maxlen=seqlen[i]; } printf("%d/n",maxlen); return 0; }
阅读全文
0 0
- 最长递增子序列长度(动态规划)
- 最长递增子序列(动态规划)
- 最长递增子序列(动态规划)
- 最长递增子序列(动态规划)
- 01动态规划基础---最长递增子序列长度
- 动态规划-数组最长递增子序列长度
- 动态规划之,最长公共子序列,最长上升子序列,最长公共递增子序列的长度
- 动态规划:最长单调递增子序列
- 动态规划之最长递增子序列
- 动态规划--最长单调递增子序列
- 动态规划_最长递增子序列
- 动态规划之最长递增子序列
- 【动态规划】单调递增最长子序列
- 动态规划 - 最长递增子序列
- 最长单调递增子序列--动态规划
- 动态规划 最长递增子序列
- 动态规划最长递增子序列问题
- 动态规划求最长递增子序列
- HDU 5676 ztr loves lucky numbers
- c++中的构造函数注意事项
- hive计算map数和reduce数
- [Struts2] 值栈
- 【Array】数组删除最后一个元素;
- 最长递增子序列长度(动态规划)
- 牛客 题库 6 堆栈
- JAVA 习题
- 第一周、课时4:js组成和命名规范
- 206. Reverse Linked List
- Hive-hive.groupby.skewindata配置相关问题调研
- JavaScript面向对象的笔记
- 标准方程和梯度下降
- 运放自激震荡的大杂烩总结