题解 | #Redraiment的走法#
Redraiment的走法
http://www.nowcoder.com/practice/24e6243b9f0446b081b1d6d32f2aa3aa
#include <stdlib.h>
#include <stdio.h>
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
int arr[300] = {0}, dp[300] = {0};
for(int i=0; i<n; i++)
{
scanf("%d", &arr[i]);
}
dp[0] = 1;
int maxans = 1;
for(int i=1; i<n; i++)
{
int maxval = 0;
for(int j=0; j<i; j++)
{
if(arr[i] > arr[j])
maxval = (maxval > dp[j]) ? maxval : dp[j];
}
dp[i] = maxval + 1;
maxans = (maxans > dp[i]) ? maxans : dp[i];
}
printf("%d\n", maxans);
}
return 0;
}
这题还是比较有意思的, 他维护了一个动态规划数组dp[300];
默认第一跳 跳数为1, 并且dp[]其实就是最长子串数组,如果检测到当前数字arr[i] > 遍历之前的数字arr[j], 那么他就会在dp[j]的基础上进行更新, 更新条件是判断当前(maxval > dp[j])是否为最优子串.这种解法的时间复杂度为 O(n2)
有空可以挑战一下O(nlgn)