码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划--最长单调子序列问题

时间:2015-06-24 10:39:31      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

1.问题描述:

求一个正整数序列的最长单调自增子序列,子序列不要求是连续的。例如

Input:5

5 2 4 3 1

Output:2

 

2. 算法复杂度是O(N*N)

确定状态转移方程,设f[i]是以a[i]为结尾的最大值的子序列的长度,那么\[\max \{ f[i]\} \]的最大值就是要的结果。

所以转移方程为:

\[f(i) = \max \{ f(x)|x < i,{a_i} > {a_x}\}  + 1\]

所以代码可以为:

void main(void)
{
	int arr[] = {10,4,20,10,15,13};
	int dist[6];
	int path[6];
	int num = 6;
	int i = 0;

	for(i = 0; i < 6; i++)
	{
		dist[i] = 0;
		//-1表示前面没有元素了,用于回头求解的时候定界
		path[i] = -1;
	}

	for(i = 0; i < num; i++)
	{
		int temp = 0;
		int index = -1;

		for(int j = i - 1; j >= 0; j--)
		{
			if(arr[i] > arr[j] && dist[j] > temp)
			{
				temp = dist[j];
				index = j;
			}//if
		}//for

		dist[i] = temp + 1;
		path[i] = index;

	}//for

	//找到最大的那个值
	int max = 0;
	int maxIndex = -1;
	for(int m = 0; m < num; m++)
	{
		if(dist[m] > max)
		{
			max = dist[m];
			maxIndex = m;
		}
	}//for
	printf("最长单曾子序列的长度是%d.\n", max);

	while(path[maxIndex] != -1)
	{
		printf("%d->", arr[maxIndex]);
		maxIndex = path[maxIndex];
	}//while
	printf("%d\n", arr[maxIndex]);

}

  

动态规划--最长单调子序列问题

标签:

原文地址:http://www.cnblogs.com/stemon/p/4596883.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!