华为OJ——Redraiment的走法

Redraiment的走法

题目描述

题目描述 

   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

接口说明

方法原型:

    int GetResult(int num, int[] pInput, List  pResult);

输入参数:
   int num:整数,表示数组元素的个数(保证有效)。
   int[] pInput: 数组,存放输入的数字。

输出参数:
   List pResult: 保证传入一个空的List,要求把结果放入第一个位置。
返回值:
  正确返回1,错误返回0

输入描述:

输入多行,先输入数组的个数,再输入相应个数的整数

输出描述:

输出结果

输入例子:

6

2

5

1

5

4

5

输出例子:

3

解答代码:

#include<iostream>
#include<cstdio>
#include<fstream>
#define LEN 1024
using namespace std;

//变长数组参数,记录当前各元素作为最大元素的最长递增序列长度  
int liss[LEN];  
//前驱元素数组,记录当前以该元素作为最大元素的递增序列中该元素的前驱节点 
int pre[LEN];

int LISSIncre(int array[],int length)  
{  
    int i, j, k, max;    
    for(i = 0; i < length; ++i)  
    {  
        liss[i] = 1;  
        pre[i] = i;  
    }  
    for(i = 1, max = 1, k = 0; i < length; ++i)  
    {  
        //找到以array[i]为最末元素的最长递增子序列  
        for(j = 0; j < i; ++j)  
        {  
            //如果要求非递减子序列只需将array[j] < array[i]改成<=,  
            //如果要求递减子序列只需改为>  
            if(array[j] < array[i] && liss[j] + 1> liss[i])  
            {  
                liss[i] = liss[j] + 1;  
                pre[i] = j;  
                //得到当前最长递增子序列的长度,以及该子序列的最末元素的位置  
                if(max < liss[i])  
                {  
                    max = liss[i];  
                    k = i;  
                }  
            }  
        }  
    }  
    return max;  
}  

int main()
{
	int i,n,data[LEN];
	while(cin>>n)
	{
		for(i=0;i<n;i++)
			cin>>data[i];
		int result=LISSIncre(data,n);
		cout<<result<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值