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 分钟前
MySQL内置函数
android·数据库·c++·后端·mysql·开发·函数
AC__dream11 分钟前
2024秋招-字节跳动-算法岗笔试
数据结构·算法
一叶落43816 分钟前
LeetCode 151. 反转字符串中的单词(C语言)【双指针 + 字符串处理】
c语言·数据结构·算法·leetcode
wangjialelele17 分钟前
详解Redis终端操作和Redis-plus-plus接口使用
linux·数据库·c++·redis·分布式·缓存·中间件
_olone17 分钟前
牛客每日一题:刷题统计(Java)
java·算法·容斥原理·牛客
无敌憨憨大王18 分钟前
DFS(深搜)
算法·深度优先·图论
junnhwan18 分钟前
LeetCode Hot 100——栈
java·数据结构·算法·leetcode·hot 100
hyl2001220 分钟前
c++ SCIP求解整数规划模型
开发语言·c++
sqyno1sky21 分钟前
代码动态生成技术
开发语言·c++·算法
superior tigre23 分钟前
347 前k个高频元素
数据结构·算法·leetcode