1、题目:求一个一维数组(N个元素)中最长递增子序列的长度。
例如,在序列1,-1,2,-3,4,-5,6,-7中,其最长递增子序列为1,2,4,6。
根据无后效性的定义,将各阶段按照一定的次序排好之后,对于某个给定阶段的状态来说,它以前各阶段的状态无法直接影响它未来的决策,而只能间接地通过当前状态来影响。换句话说,每个状态都是过去历史的一个完整总结。
int LIS(int[], array)
{
int[] LIS = new int[array.Length];
for(int i=0; i<array.Length; i++)
{
LIS[i] = 1; //初始化默认的长度
for(int j=0; j<i; j++) //前面最长的序列
{
if(array[i] > array[j] && LIS[j] + 1 > LIS[i])
{
LIS[i] = LIS[j] + 1;
}
}
}
return Max(LIS); //取LIS的最大值
}
它的时间复杂度为O(N^2 + N) = O(N*N).
本文介绍了一种求解一维数组中最长递增子序列长度的方法,并给出具体实现代码。利用动态规划思想,该算法将问题分解为一系列子问题,并以O(N^2)的时间复杂度解决。
1695

被折叠的 条评论
为什么被折叠?



