1. 程式人生 > >最大連續遞增/遞減/非遞增/非遞減子序列的長度(二分優化)

最大連續遞增/遞減/非遞增/非遞減子序列的長度(二分優化)

預設是單調遞增:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1000005];
char c[1000005];
int maxv[1000005];
int bin(int x,int len)
{
    int left,right,mid;
    left=1;
    right=len;
    while(left<=right)
    {
        mid=left+(right-left)/2;
        if(maxv[mid]==x)
            return mid;//(2)return mid+1;//非遞減
        else if(maxv[mid]<x)//(1)maxv[mid]>x:單調遞減
            left=mid+1;
        else
            right=mid-1;
    }
    return left;
}
int main()
{
    int n,i,j,len;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",c);
        for(i=0; i<strlen(c); i++)
        {
            a[i+1]=c[i]-'a';
        }
        maxv[1]=a[1];
        len=1;
        for(i=2; i<=strlen(c); i++)
        {
            if(a[i]>maxv[len])//(1) <
                maxv[++len]=a[i];
            else
            {
                int pos=bin(a[i],len);
                maxv[pos]=a[i];
            }
        }
        printf("%d\n",len);
    }
}


相關推薦

連續遞增/遞減/遞增/遞減序列長度二分優化

預設是單調遞增:#include<stdio.h> #include<iostream> #include<string.h> #include<algorit

長相等序列長度順序表

1.題目:  Problem Description 給定一個有n個元素的整數陣列b,b中連續的相等元素構成的子序列稱為平臺。設計一個演算法求b中最長平臺的長度。  Input 第一行為一個數字m

51nod 1218 遞增序列 V2dp + 思維

ear www str tdi binsearch tor con bsp href 題目鏈接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1218 題解:先要確定這些點是不是屬於最長

連續序列求和5種

1.採用簡單dp與分治策略(與0比較) 每輸入一個數字進行比較與求和,該次求和與上一次求和值進行比較並完成相應的替換, 上一次值與當前輸入元素進行比較。 #include<cstdio> #include<cst

連續序列之和動態規劃

1. 問題描述 設n個元素的序列儲存在陣列A[0..n-1]中,求陣列中連續子序列之和的最大值。 2. 遞推公式 設All[i]為子問題A[i..n-1]的連續子序列之和的最大值,start[i]為從A[i]開始的連續序列之和的最大值,因此: All[i] = A[n-

單調遞增序列(二)南陽oj214

單調遞增子序列(二) 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述 給定一整型數列{a1,a2...,an}(0<n<=100000),找出單調遞增最長子序列,並求出其長度。 如:1 9 10 5 11 2 13的

長公共序列Lcs 51Nod - 1006

string OS 模板題 != std ring str spa sin 20180604 11:28 給出兩個字符串A B,求A與B的最長公共子序列(子序列不要求是連續的)。 比如兩個串為: abcicba abdkscab ab是兩個串的子序列

長上升序列模板Java版

hdu1257 d[i]就是儲存到i的最大上升子序列長度 g[i]儲存長度為i的最大上升子序列的的最小編號(因為編號越小越有機會有上升子序列的機會) import java.util.Scanner;

演算法導論-----長公共序列LCS動態規劃

目錄 一.概念梳理   1. 子序列(subsequence): 一個特定序列的子序列就是將給定序列中零個或多個元素去掉後得到的結果(不改變元素間相對次序)。例如序列<A,B,C,B,D,A,B>的子序列有:<A,B>、&l

O(n)的方法求長迴文長度Manacher演算法

大體思路其實就是找出一箇中心點,判斷中心點兩端的迴文串半徑是多少; 但由於找中心點的方法只適用於奇數長的迴文串,故可以在每兩個字元間插入一個間隔符來幫助結算; 用rd[i]表示以經過填充後的字串裡的第i個字元為中心,它的迴文串長度; 可以得知,在【

動態規劃遞增序列LIS、連續序列和、連續序列乘積

最長遞增子序列LIS 問題 給定一個長度為N的陣列,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂)。例如:給定一個長度為6的陣列A{5, 6, 7, 1, 2, 8},則其最長的單調遞增子序列為{5,6,7,8},長度為4. 最長遞增子序列

連續序列和”、“遞增序列”、“公共序列”、“長公共串”問題總結

一、最大連續子序列和(最大子序列) 最大子序列是要找出由陣列成的一維陣列中和最大的連續子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,達到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。 思路:只要前i項的和還沒有小

【資料結構】陣列中的連續遞增序列

陣列中的數是亂序的,求出陣列中最大的連續子序列(這裡為遞增)。 方法一:用一個輔助陣列list[length],記錄下陣列中每個元素對應的最大連續序列長度,預設為1,即從該元素後沒有連續的序列。當i元

[luoguP2766] 遞增序列問題

close spl 方法 emp 路徑 pid code display div 傳送門 題解來自網絡流24題: 【問題分析】 第一問時LIS,動態規劃求解,第二問和第三問用網絡最大流解決。 【建模方法】 首先動態規劃求出F[i],表示以第i位為開頭的最長上

單鏈表查找值、兩個遞增的鏈表合並並且去重

lin esp new ace ext color 查找 class AI 單鏈表查找最大值 代碼: 1 #include<iostream> 2 #include<bits/stdc++.h> 3 using namespace std;

連續序列 HDU - 1231

bsp 最大 程序 結構 %d col 最小 元素 class 給定K個整數的序列{ N1, N2, ..., NK },其任意連續子序列可表示為{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大連續子序列是所有連續子

LeetCode -- 連續乘積序列

solution leet 推公式 name class return pre [0 連續 問題描寫敘述: 給定數組,找出連續乘積最大值的子序列。比如 0,-1,-3。-2。則最大連續乘積為6= (-3) * (-2)實現思路此題與最大連續和的子序列問題相似,也可通過找到

阿裏筆試題:求兩個子序列連續序列

代碼 else nat 順序 post string popu substr 連續 原題例如以下: 給定一個query和一個text。均由小寫字母組成。要求在text中找出以相同的順序連續出如今query中的最長連續字母序列的長度。比如。query為 "acbac",t

485. Max Consecutive Ones 連續 by Python

大連 put int statistic inpu one emp bin 簡單 485. Max Consecutive Ones 題目: Given a binary array, find the maximum number of consecutive 1s in

HDU 1231 連續序列:水dp

一段 size pid 答案 定義 題意 如果 最大連續子序列 esp 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 題意:   給你一個整數序列,求連續子序列元素之和最大,並輸出該序列的首尾元素(若不唯一,輸出首坐