hduoj_1087(dp水题)

这道题使我想起了LIS问题。

两者不同的是

LIS要使得上升子序列的长度最大。

该问题要使得上升子序列的累加和最大。


整体思路没有问题,写的也很快。

但是有一种情况没有考虑到,就是从start点直接走到第i点的情况。导致WA了两次。


记得校选赛的时候求解LIS问题,要求使用时间复杂度为O(n*lgn)的算法,没写出来。这两天也要复习一下。


下面代码的时间复杂度为O(n^2)。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int a[1001];
int dp[1001];

int main()
{
	int N;
	int i, j;
	int max;
	while (EOF != scanf("%d", &N) && N)
	{
		memset(dp, 0, sizeof(dp));
		
		for (i = 1; i <= N; i++)
		{
			scanf("%d", &a[i]);
			dp[i] = a[i];             /* 差了这一行,相当于忽略了从start直接走到i点的情况 */
		}
			
		for (i = 1; i <= N; i++)
		{
			for (j = 1; j < i; j++)
			{
				if ((a[i] > a[j]) && (dp[i] < dp[j] + a[i]))
					dp[i] = dp[j] + a[i];
			}
		}

		max = INT_MIN;
		for (i = 1; i <= N; i++)
			max = max > dp[i] ? max : dp[i];

		printf("%d\n", max);
	}
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_32862515/article/details/80737998
今日推荐