CUGB 1032 DP简答题,有了前面的教训,这道题做起来顺手多了,不过还是遇到点小麻烦,好在都解决了。此题很容易误认为只须求一次最大上升子序列。殊不知上了山后还要再下来!
#include<stdio.h>
int main()
{
int i,j, N, h[1002],dp2[1002];
int temp, dp[1002], max;
while(scanf("%d", &N) != EOF)
{
for(i=1; i<=N; i++)
{
scanf("%d", &h[i]);
}
dp[1] = 1;
for (i=2; i<=N; i++)
{
temp = 0;
for (j=1; j<i; j++)
{
if ((h[i]>h[j]) && (temp<dp[j]+1))
temp = dp[j];
}
dp[i] = temp + 1;
}
dp2[N] = 1;
for (i=N-1; i>0; i--)
{
temp = 0;
for (j=N; j>i; j--)
{
if ((h[i]>h[j]) && (temp < dp2[j]+1))
temp = dp2[j];
}
dp2[i] = temp + 1;
}
max = 0;
for(i=1; i<=N; i++)
{
if(dp[i] + dp2[i] > max)
max = dp[i]+dp2[i];
}
printf("%d\n",max-1);
}
return 0;
}