华为机试HJ103:Redraiment的走法

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ103:Redraiment的走法相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

Redraiment是走梅花桩的高手。Redraiment可以选择任意一个起点,从前到后,但只能从低处往高处的桩子走。他希望走的步数最多,你能替Redraiment研究他最多走的步数吗?

本题含有多组样例输入

输入描述:

输入多组数据,1组有2行,第1行先输入数组的个数,第2行再输入梅花桩的高度

输出描述:

一组输出一个结果

示例:

输入:

6
2 5 1 5 4 5 
3
3 2 1

输出:

3
1

说明:

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。   

解题思路:

这道题是个标准的最长升序子序列问题,用动态规划求解。v存放梅花桩高度信息,result用来作动态规划表,每个位置对应的result值就是截止到当前遍历时间点时的最大行进步数;从前向后遍历梅花桩,每到某个位置,再遍历该位置前的梅花桩,若前面的位置低于当前位置,则刷新当前位置的result值,刷新结果为当前位置result值和前面位置result值+1这两者间的最大值;这样每个位置的result值动态刷新,直到遍历全部完成后,result值最大的数值就是结果。

测试代码:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int num;
    while(cin>>num)
    {
        vector<int> v;
        for(int i=0;i<num;++i)
        {
            int temp;
            cin>>temp;
            v.push_back(temp);
        }
        vector<int> result(num,1);
        for(int i=0;i<num;++i)
        {
            for(int j=0;j<i;++j)
            {
                if(v[j]<v[i])
                {
                    result[i]=max(result[i],result[j]+1);
                }
            }
        }
        int max = *max_element(result.begin(), result.end());
        cout<<max<<endl;
    }
    return 0;
}

以上是关于华为机试HJ103:Redraiment的走法的主要内容,如果未能解决你的问题,请参考以下文章

HJ103 Redraiment的走法(梅花桩递增可走的最多步数)_排序_动态规划

华为机试HJ91:走方格的方案数

华为机试HJ91:走方格的方案数

华为机试练习 - 动态规划 - 最大递增数列

华为机试-HJ68 成绩排序

华为机试HJ19:简单错误记录