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

Posted Aneverforget

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HJ103 Redraiment的走法(梅花桩递增可走的最多步数)_排序_动态规划相关的知识,希望对你有一定的参考价值。

思路:

该题目符合,最优结果拥有最优子结果的特征。考虑用动态规划。通过循环获取每个参数作为最后一个桩的最优子结果,后面桩的结果为前一个桩的最优子结果+1。如梅花桩“2 5 1 5 4 5”。参考高赞答案,代码如下

 import sys
 a=int(sys.stdin.readline().strip())
 b=list(map(int,sys.stdin.readline().strip().split()))
 bp=[1 for i in range(a)]#每个梅花桩最少梅花桩步数为1,自己本身
 #print(bp)
 for i in range(a-1):#循环以i为第一步
     for j in range(i+1,a):#循环得到j的梅花桩步数
         if b[j]>b[i]:
             bp[j]=max(bp[j],bp[i]+1)#b[j]>b[i]则b[j]一定比b[i]大一步。
 print(max(bp))

 

华为机试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的走法

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

ACM童年生活二三事

ZZNUOJ_C语言1091:童年生活二三事(多实例测试)(完整代码)

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

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