HJ103 Redraiment的走法

知识点排序

描述

Redraiment 是走梅花桩的高手。现在,地上有 n 个梅花桩排成一排,从前到后高度依次为 h1,h2,...,hn。

Redraiment 可以任选一个梅花桩开始,向后跳到任意一个比当前高度高的梅花桩上。

求 Redraiment 最多可以跳过多少个梅花桩。

输入描述:

第一行输入一个整数 n(1≦n≦200)代表梅花桩的数量。

第二行输入 n 个整数 h1,h2,...,hn(1≦hi≦350)代表每一个梅花桩的高度。

输出描述:

输出一个正整数,代表 Redraiment 最多可以跳过多少个梅花桩。

示例1

输入:

复制代码
6
2 5 1 5 4 5

输出:

复制代码
3

说明:

复制代码
在这个样例中,其中一个最优的选择是,从第一个桩子起跳,最多可以跳三个梅花桩,使用橙色加粗标识:{2,5,1,5,4,5}。
另外一种最优选择是,从第三个桩子起跳,最多也可以跳三个梅花桩,使用橙色加粗标识:{2,5,1,5,4,5}。
cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

int lis(vector<int>& arr) {
    vector<int> dp(arr.size(), 1); //设置数组长度大小的动态规划辅助数组
    int max = 1;
    for(int i = 1; i < arr.size(); i++){
         for(int j = 0; j < i; j++){
            if(arr[i] > arr[j] && dp[i] < dp[j] + 1) {
                dp[i] = dp[j] + 1; //i点比j点大,理论上dp要加1
                //但是可能j不是所需要的最大的,因此需要dp[i] < dp[j] + 1
                max = max > dp[i] ? max : dp[i]; //找到最大长度
            }
        }
    }
    return max;
}

int main(){
    int n;
    while(cin >> n){
        vector<int> arr(n);
        for(int i = 0; i < n; i++) //输入
            cin >> arr[i];
        cout << lis(arr) << endl; //计算最长递增子序列长度
    }
    return 0;
}
相关推荐
南境十里·墨染春水2 小时前
C++ 工厂模式:从入门到进阶,彻底掌握对象创建的艺术
开发语言·c++·算法
@insist1232 小时前
系统架构设计师-实时性评价、调度算法与内核架构选型
算法·架构·系统架构·软考·系统架构设计师·软件水平考试
一拳一个呆瓜5 小时前
【STL】_SCL_SECURE_NO_WARNINGS
c++·stl
小小编程路6 小时前
C++ 异常 完整讲解
开发语言·c++
一只齐刘海的猫8 小时前
【Leetcode】找到字符串中所有字母异位词
算法·leetcode·职场和发展
海清河晏1118 小时前
数据结构 | 八大排序
数据结构·算法·排序算法
Frank学习路上9 小时前
【C++】面试:关键字与语法特性
c++·面试
IronMurphy9 小时前
【算法五十七】146. LRU 缓存
算法·缓存
Irissgwe10 小时前
数据结构-栈和队列
数据结构·c++·c·栈和队列