选择子序列(51nod-1153)

来源:互联网 发布:U递索引超出了数组界限 编辑:程序博客网 时间:2024/05/22 02:07
1153 选择子序列
题目来源: Codility
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
长度为N的整数数组A,所有的数均不相同,假设下标从0开始。找到一个最长的数组B,B数组的长度为K,数值范围是0 - N - 1,记录的是A数组的下标。满足A[B[0]] > A[B[1]] > A[B[2]] >...A[B[K]],并且对任意连续的两项B[i]及B[i + 1],满足min(B[i],B[i + 1]) < j < max(B[i],B[i + 1]) 均有A[j] < A[B[i + 1]] ,求最大的K。例如:9, 10, 2, -1, 3, -5, 0, -3, 1, 12, 5, 8, -2, 6, 4。可以选出:12, 10, 3, 1, 0, -3。对应的下标为:9, 1, 4, 8, 6, 7(就是B数组),输出6。
Input
第1行:一个数N,表示A数组的长度。(1 <= N <= 50000)第2 - N + 1行:每行1个数对应A数组的元素Ai(0 < Ai < 10^9)
Output
输出B数组最长的长度K。
Input示例
159102-13-50-311258-264

Output示例

6

此题的题意是要选一个B数组,使得B数组递减,而且相邻元素的数字在原数组的位置之间没

数字比后一个数字大,那么我们还是有点贪心的思想,想找到最大的数字,然后数据被分

成左右两部分,然后我们在找最大的数字。用递归来求最大值。

#include<stdio.h>#include<algorithm>using namespace std;int a[100010];int dfs(int l,int r){    if(l==r)    //如果上一层的mid=l+1;那么l=r时没必要再去找最大值。直接返回1。    {        return 1;    }    else if(l>r) //如果上一层的mid=l;那么之前就l=r。直接返回0。    {        return 0;    }    int max_=-1;    int mid;    for(int i=l;i<=r;i++)    {        if(a[i]>max_)        {            max_=a[i];            mid=i;        }    }    return max(dfs(l,mid-1),dfs(mid+1,r))+1;//往左右查找。}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        scanf("%d",&a[i]);    }   int ans=dfs(0,n-1);   printf("%d\n",ans);}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 84把衣服洗花了怎么办 衣服用84洗掉色怎么办 被84褪色的衣服怎么办 衣服被84烧红了怎么办 84溅到衣服上边怎么办 84把衣服泡花了怎么办 衣服颜色洗旧了怎么办 蒙版画笔用不了怎么办 眼睛小血管破裂出血怎么办 雅漾喷头坏了怎么办 一夜都是浅睡眠怎么办 注塑机合不了膜怎么办 吸了塑料烧焦味怎么办 热熔的管漏水怎么办 45岁了月经不来怎么办 吃了芒果身上痒怎么办 10个月宝宝上火怎么办 1个月的宝宝上火怎么办 2个月的婴儿上火怎么办 1岁宝宝不吃奶粉怎么办 奶水不够宝宝又不吃奶瓶怎么办 13岁脸上长粉刺怎么办 脸敷面膜过敏了怎么办 婴儿面膜是假的怎么办 一贴面膜就过敏怎么办 一敷面膜就过敏怎么办 敷了面膜后过敏怎么办 脸做面膜过敏了怎么办 二十几年的疤痕怎么办 三星c5听筒坏了怎么办 胖子减肥后皮肤松弛怎么办 小婴儿脸上长癣怎么办 痘痘里面有脓怎么办 牛仔外套买大了怎么办 脸上痘印红红的怎么办 眼罩里的水干了怎么办 面膜水进眼睛里怎么办 面膜用剩的精华怎么办 火山泥面膜边干怎么办 用完撕拉面膜后怎么办 皮肤锁水能力差怎么办