知识点排序
描述
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;
}