最长递增子序列长度(动态规划)
2017-09-07 21:25
190 查看
状态方程:
MaxLen (1) = 1
MaxLen (k) = Max { MaxLen (i)+1:1<i < k 且 ai < ak }(取所有MaxLen里面最大那个拿出来当最长子序列的长度)
当然丢出一个状态方程可能会比较懵逼,讲道理过一段时间我再回来看可能也会懵逼,所以我得举一个小例子来讲一下
给定的数组为{5,6,7,1,2,8},则MaxLen(0)=1, MaxLen(1)=2, MaxLen(2)=3, MaxLen(3)=1, MaxLen(4)=2, MaxLen(5)=4。所以该数组最长递增子序列长度为4,序列为{5,6,7,8}。
其实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];
}
print
4000
f("%d/n",maxlen);
return 0;
}
MaxLen (1) = 1
MaxLen (k) = Max { MaxLen (i)+1:1<i < k 且 ai < ak }(取所有MaxLen里面最大那个拿出来当最长子序列的长度)
当然丢出一个状态方程可能会比较懵逼,讲道理过一段时间我再回来看可能也会懵逼,所以我得举一个小例子来讲一下
给定的数组为{5,6,7,1,2,8},则MaxLen(0)=1, MaxLen(1)=2, MaxLen(2)=3, MaxLen(3)=1, MaxLen(4)=2, MaxLen(5)=4。所以该数组最长递增子序列长度为4,序列为{5,6,7,8}。
其实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];
}
4000
f("%d/n",maxlen);
return 0;
}
相关文章推荐
- 动态规划求解最长递增子序列的长度
- 算法-计算递增最大子序列长度(动态规划)
- 最长递增子序列(动态规划)
- 动态规划——最长公共子序列(LCS)&最长递增子序列(LIS)
- 最长递增子序列问题——动态规划
- 最长递增子序列(动态规划)
- 【递归&动态规划】一个长度为n的无重复序列入栈的所有出栈方式
- NYOJ 236 心急的C小加(最长递增子序列长度)
- 动态规划——最长递增子序列 收藏
- 动态规划求最长递增子序列(BJFUOJ 1482)
- SDUT_最长上升子序列长度_动态规划
- Python动态规划求解最长递增子序列(LIS)
- 最长递增子序列(LIS)-动态规划
- 【动态规划】之求最长上升子序列长度(难度:2星)
- 动态规划——求最长上升子序列长度
- 求整数数组中的最长递增子序列长度
- 算法系列笔记6(动态规划—最长公共子序列/串lcs和最长递增子序列(LIS))
- 最长递增子序列(输出最长递增序列 及其长度)
- 最长递增子序列的长度
- 最长递增子序列,最长,进一步要给出一个序列(动态规划)