HJ103 Redraiment 的走法
题目描述
Redraiment 是走梅花桩的高手。现在,地上有 n 个梅花桩排成一排,从前到后高度依次为 h1, h2, ..., hn。 Redraiment 可以任选一个梅花桩开始,向后跳到任意一个比当前高度高的梅花桩上。 求 Redraiment 最多可以跳过多少个梅花桩。
输入描述
第一行输入一个整数 n (1≤n≤200) 代表梅花桩的数量。 第二行输入 n 个整数 h1, h2, ..., hn (1≤hi≤350) 代表每一个梅花桩的高度。
输出描述
输出一个正整数,代表 Redraiment 最多可以跳过多少个梅花桩。
示例
输入: 6 2 5 1 5 4 5
输出: 3
说明: 在这个样例中,其中一个最优的选择是,从第一个桩子起跳,最多可以跳三个梅花桩。另外一种最优选择是,从第三个桩子起跳,最多也可以跳三个梅花桩。
方法一:暴力枚举
使用二进制进位法遍历所有可能组合,再挑选出符合题意的最长子序列。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int GetRes(const vector<int> nums) {
int max_len = 0;
int n = nums.size();
if (n <= 1) {
return n;
}
// i 表示起点
for (unsigned long long int mask = 0; mask < (1 << n); ++mask) {
vector<int> tmp;
// j 表示后边需要跳入位置的起点
for (int j = 0; j < n; ++j) {
(mask & ( << j)) {
tmp.(nums[j]);
}
}
flag = ;
cnt = ;
( j = ; j < ()tmp.() - ; ++j) {
(tmp[j] > tmp[j + ]) {
flag = ;
;
}
cnt++;
}
(flag && max_len < ()tmp.()) {
max_len = tmp.();
}
}
max_len;
}
{
n = ;
(cin >> n) {
;
( i = ; i < n; ++i) {
cin >> nums[i];
}
cout << (nums) << endl;
}
;
}

