三峡建设网站,wcf网站开发,发布外链的平台有哪些,做企业网站有效果吗注意事项#xff1a; 本题为线性dp—最长上升子序列的长度的扩展题#xff0c;所以dp思路这里就不再赘述。
题目#xff1a; 怪盗基德是一个充满传奇色彩的怪盗#xff0c;专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方#xff0c;就是他每次都能逃脱中…注意事项 本题为线性dp—最长上升子序列的长度的扩展题所以dp思路这里就不再赘述。
题目 怪盗基德是一个充满传奇色彩的怪盗专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方就是他每次都能逃脱中村警部的重重围堵而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。
有一天怪盗基德像往常一样偷走了一颗珍贵的钻石不料却被柯南小朋友识破了伪装而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。 不得已怪盗基德只能操作受损的滑翔翼逃脱。 假设城市中一共有N幢建筑排成一条线每幢建筑的高度各不相同。 初始时怪盗基德可以在任何一幢建筑的顶端。 他可以选择一个方向逃跑但是不能中途改变方向因为中森警部会在后面追击。 因为滑翔翼动力装置受损他只能往下滑行即只能从较高的建筑滑翔到较低的建筑。 他希望尽可能多地经过不同建筑的顶部这样可以减缓下降时的冲击力减少受伤的可能性。 请问他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)
输入格式 输入数据第一行是一个整数K代表有K组测试数据。 每组测试数据包含两行第一行是一个整数N代表有N幢建筑。第二行包含N个不同的整数每一个对应一幢建筑的高度h按照建筑的排列顺序给出。
输出格式 对于每一组测试数据输出一行包含一个整数代表怪盗基德最多可以经过的建筑数量。
数据范围 1≤K≤100, 1≤N≤100, 0h10000
输入:
3
8
300 207 155 299 298 170 158 65
8
65 158 170 298 299 155 207 300
10
2 1 3 4 5 6 7 8 9 10输出
6
6
9#include cmath
#include cstring
#include iostream
#include algorithm
using namespace std;const int N 110;
int w[N], f[N];
int k, n; //接收k组数据n每次会被更新// 最长上升子序列的基础模板
int lis() {for (int i 1; i n; i) {f[i] 1;for (int j 1; ji; j) {if (w[j] w[i]) {f[i] max(f[i], f[j]1);}}}int res 0;for (int i 1; in; i) res max(res, f[i]);return res;
}int main ()
{cin k;while (k--) { //k组数据cin n;for (int i 1; in; i) cin w[i];//求一次最长上升子序列然后把序列倒过来再求一遍相当于拿到最长下降子序列//也就是超两个方向飞都计算了然后取最大值即可int m1 lis();reverse(w1, wn1); //这里记得从下标1开始翻转因为读入是从1开始int m2 lis();cout max(m1, m2) endl;}return 0;
}思路 根据题目中我们可以知道需要选择向左或向右方向飞行 那其实也就是要我们求出 最长上升子序列 和 最长下降子序列 的长度取max即可思路比较简单。
声明 算法思路来源为y总详细请见https://www.acwing.com/ 本文仅用作学习记录和交流