题解 | #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)

全部评论

相关推荐

02-26 16:52
宜春学院 Java
Lunarloop:董事长亲自到ssob来要IM项目的技术方案来了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务