// 最长单调递减子序列.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int error = 0;
/*
* 函数功能 : 打印最长递减子序列
* 函数参数 : pArray指向源数组,pB指向辅助数组,k表示最长子序列的末尾元素(值最大的元素下标)
* 返回值 : 无
*/
void Print(int *pArray, int *pB, int k)
{
for (int idx=k-1; idx>=0; --idx)
{
if (pB[idx] < pB[k])
{
Print(pArray, pB, idx);
break;
}
}
printf("%d, ", pArray[k]);
}
/*
* 函数功能 : 一个数组的最长递减子序列
* 函数参数 : pArray指向源数组,len表示数组长度
* 返回值 : 无
*/
/*
* 整个算法的核心部分是公式 B[i] = max{B[k] + 1, A[k]>A[i]&&0=<k<i} , B[0] = 1
* {9, 4, 3, 2, 5, 4, 3, 2}
*/
void FindMDS(int *pArray, int len)
{
if ((pArray == NULL) || (len <= 0))
{
error = 1;
}
int *B = new int[len];
// 因为动态规划是有之前一个状态推导下一个状态,必须要有一个起始值
B[0] = 1;
// 最外层循环将轮询所从1 到 数组的最后一位,并计算出每一个B[i]的值
for (int i=1; i<len; ++i)
{
int MaxLen = 0;
for (int k=0; k<i; ++k)
{
if (pArray[k] > pArray[i])
{
if (B[k] > MaxLen)
{
MaxLen = B[k];
}
}
}
B[i] = MaxLen + 1;
}
int MaxB = 0;
int MaxIndex = 0;
for (int j = 0; j<len; ++j)
{
if (B[j] > MaxB)
{
MaxB = B[j];
MaxIndex = j;
}
}
Print(pArray, B, MaxIndex);
delete [] B;
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
int Myarray[] = {9,4,3,2,5,4,3,2};
FindMDS(Myarray, 8);
return 0;
}
最长单调递减序列
最新推荐文章于 2020-04-08 09:12:50 发布