题目描述
题目描述
Redraiment是走梅花桩的高手。Redraiment总是起点不限,从前到后,往高的桩子走,但走的步数最多,不知道为什么?你能替Redraiment研究他最多走的步数吗?
样例输入
6
2 5 1 5 4 5
样例输出
3
提示
Example:
6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5
从第5格开始走最多有2步,4 5
所以这个结果是3。
输入描述:
输入多行,先输入数组的个数,再输入相应个数的整数
输出描述:
输出结果
示例1
输入
6
2
5
1
5
4
5
输出
3
算法实现
#include <iostream>
#include <vector>
using namespace std;
//动态规划
int main()
{
int N;
while (std::cin >> N)
{
std::vector<int> Data(N, 0); // 存放桩高度数据
std::vector<int> Step(N, 1); // 每个位置的置对应存放第一个桩和当前桩的最大步数
int ret = 0;// 最大步数
for (int i = 0; i < N; ++i)
{
std::cin >> Data[i]; // 输入数据
for (int j = 0;j < i;++ j) // 每次加一根i,与前面的木桩动态比较(当前桩i的数据根据之前的桩j数据得出(和后续的无关))
{
if (Data[i] > Data[j] && Step[i] < Step[j] + 1) // 当前桩i的高度大于之前的某个桩j时 且 可以多走一步
{
Step[i] = Step[j] + 1;
}
}
ret = (ret > Step[i]) ? ret : Step[i];// 从每个桩的最大步数中选出最大值
}
std::cout << ret << std::endl;
}
return 0;
}