列表

详情


HJ103. Redraiment的走法

描述

Redraiment是走梅花桩的高手。Redraiment可以选择任意一个起点,从前到后,但只能从低处往高处的桩子走。他希望走的步数最多,你能替Redraiment研究他最多走的步数吗?

数据范围:每组数据长度满足 , 数据大小满足



输入描述

数据共2行,第1行先输入数组的个数,第2行再输入梅花桩的高度

输出描述

输出一个结果

示例1

输入:

6
2 5 1 5 4 5 

输出:

3

说明:

6个点的高度各为 2 5 1 5 4 5 如从第1格开始走,最多为3步, 2 4 5 ,下标分别是 1 5 6 从第2格开始走,最多只有1步,5 而从第3格开始走最多有3步,1 4 5, 下标分别是 3 5 6 从第5格开始走最多有2步,4 5, 下标分别是 5 6 所以这个结果是3。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 332KB, 提交时间: 2021-08-02

#include <stdio.h>
#include <string.h>

int main(void)
{
    int n;
    while(scanf("%d", &n) != EOF)
    {
        int arr[n];
        int dp[n], max = 0;
        for(int  i = 0;i < n;i++)
        {
            scanf("%d",  &arr[i]);
        }
        
        memset(dp, 0, sizeof(dp));
        dp[0] = 1;
        for(int i = 1;i < n;i++)
        {
            for(int j = 0;j < i;j++)
            {
                if(arr[i] > arr[j] && dp[j]+1 > dp[i])
                {
                    dp[i] = dp[j]+1;
                }else
                {
                    if(!dp[i])
                        dp[i] = 1;
                }
            }
            if(max < dp[i])
                max = dp[i];
        }
        printf("%d\n", max);
    }
    
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 344KB, 提交时间: 2020-10-31

#include <stdio.h>

int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        int num[1000]={0};
        char dp[1000]={0};
        int maxans=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d", &num[i]);
        }
        dp[0]=1;
        for(int i=1; i<n; i++)
        {
            int maxval=0;
            for(int j=0; j<i; j++)
            {
                if(num[i]>num[j])
                    maxval=maxval>dp[j]?maxval:dp[j];
            }
            dp[i]=maxval+1;
            if(maxans<dp[i])
                maxans=dp[i];
        }
        printf("%d\n", maxans);
    }
    return 0;
}

上一题