这道题使我想起了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;
}