题解 | #Redraiment的走法#

Redraiment的走法

https://www.nowcoder.com/practice/24e6243b9f0446b081b1d6d32f2aa3aa

本题有两种解法
解法一是使用递归解法,缺点是运行时间长,有大量重复计算,解法2是动态规划解法
//解法1:递归解法
#include<stdio.h>
#include<string.h>
int num;
int high[200];
int find(int i)
{
    int step = 1;
    if (i == num - 1) { return 1; }
    else
    {
        for (int j = i + 1; j < num; j++)
        {
            if (high[j] > high[i])
            {
                step = (step > (find(j) + 1)) ? step : (find(j) + 1);
            }
        }
    }
    return step;
}

int main(void)
{
    scanf("%d", &num);
    for (int i = 0; i < num; i++)
    {
        scanf("%d", &high[i]);
    }
    int max = 1;
    for (int i = 0; i < num; i++)
    {
        max = (max > find(i)) ? max : find(i);
    }
    printf("%d", max);
    return 0;
}

解法2是优化后的动态规划解法,增加了缓存数组,但本质上还是基于递归法
//解法2:动态规划解法
//主旨是定义缓存数组,减少重复计算
#include<stdio.h>
#include<string.h>
int num;
int high[200];
int dp[200]={0};
int find(int i)
{
    int step=1;
    if(dp[i]!=0){return dp[i];}//如果dp数组中已经缓存了之前存储的数据,则不用再进行计算
    if(i==num-1){return 1;}
    else
    {
        for(int j=i+1;j<num;j++)
        {
            if(high[j]>high[i])
            {
                step=(step>(find(j)+1))?step:(find(j)+1);
                dp[i]=step;
            }
        }
    }
    return step;
}

int main(void)
{
    scanf("%d",&num);
    for(int i=0;i<num;i++)
    {
        scanf("%d",&high[i]);
    }
    int max=1;
    for(int i=0;i<num;i++)
    {
        max=(max>find(i))?max:find(i);
    }
    printf("%d",max);
    return 0;
}

解法3是利用迭代法的动态规划方法,运行时间大量减少
//解法2:动态规划解法
//主旨是定义缓存数组,减少重复计算
#include<stdio.h>
#include<string.h>
int num;
int high[200];
int dp[200] = { 0 };

int main(void)
{
    scanf("%d", &num);
    for (int i = 0; i < num; i++)
    {
        scanf("%d", &high[i]);
    }
    //倒着遍历
    for (int i = 0; i < num; i++) { dp[i] = 1; }
    for (int i = num - 1; i >= 0; i--)
    {
        for (int j = i + 1; j < num; j++)
        {
            if (high[j] > high[i])
            {
                dp[i] = (dp[i] > dp[j] + 1) ? dp[i] : dp[j] + 1;
            }
        }
    }
    int max = 1;
    for (int i = 0; i < num; i++)
    {
        max = (max > dp[i]) ? max : dp[i];
    }
    printf("%d", max);
    return 0;
}




全部评论

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
评论
1
2
分享
牛客网
牛客企业服务