求最長上公升子串行和最長非下降子串行

2022-07-20 02:03:10 字數 2238 閱讀 8277

先放題:hdu 5256  

序列變換

我們有乙個數列a1,a2...an,你現在要求修改數量最少的元素,使得這個數列嚴格遞增。其中無論是修改前還是修改後,每個元素都必須是整數。 

請輸出最少需要修改多少個元素。

input      第一行輸入乙個t(1

≤t≤10

)'>t(1≤t≤10)

t(1≤t≤10),表示有多少組資料 t(

1≤t≤

10)'>t(

1≤t≤

10)'>每一組資料: t(

1≤t≤

10)'>t(

1≤t≤

10)'>第一行輸入乙個n(1

≤n≤10

5)'>n(1≤n≤105)

n(1≤n≤105),表示數列的長度 t(

1≤t≤

10)'>t(

1≤t≤

10)'>n(1

≤n≤10

5)'>第二行輸入n個數a1,

a2,.

..,a

n'>a1,a2,...,an

a1,a2,...,an。 t(

1≤t≤

10)'>n(1

≤n≤10

5)'>a1,

a2,.

..,a

n'>每乙個數列中的元素都是正整數而且不超過10

6'>106

106。

output對於每組資料,先輸出一行 

case #%d:  

然後輸出最少需要修改多少個元素;

output:

2

21 10

32 5 4

case #1:

0case #2:

1 該題思路:構造序列b[i]=a[i]-i;答案為序列總長度減去b的最長不下降子串行的長度;

這題要求最長不下降子串行;

剛開始寫錯了。。後來網上看到了乙個nlog n的做法

//

最長不下降子串行nlogn song

#include

#include

using

namespace

std;

int a[40005

];in

t d[

40005

];int

main()

d[1]=a[1]; //

初始化

int len=1

;

for (int i=2;i<=n;i++)

}printf(

"%d\n

",len);

return0;

}

(裡面求最長上公升子串行的也標註了)

還有個n2的做法,應該只能處理少數資料

#include#include

using

namespace

std;

int num,n,a[1001],sum[1001

];int

main()

printf("%d

",num);

}

然後是題目ac的**:

#include #include 

#include

#include

#include

#include

using

namespace

std;

const

int maxen=100010

;int

t,n,a[maxen],b[maxen],dp[maxen];

int main(void

)

int len=1

; dp[

1]=b[1

];

for(int i=2;i<=n;++i)

else

}printf(

"case #%d:\n

",t);

printf(

"%d\n

",n-len);

t++;

}return0;

今天又學了這兩個方法~ヾ(◍°∇°◍)ノ゙ 

2019.3.5

--九點了肚子還是好飽的猴

最長上公升子串行 和 最長不下降子串行

最長上公升子串行 是嚴格上公升的,alower bound 返回序列中大於等於key值的第乙個數 比如說序列 1 2 3 4 5,key值為3,使用lower bound返回第三個數 最長不下降子串行 不是嚴格上公升,可以存在多個數相等的情況,用upper bound upper bound 返回序...

最長上公升子串行,最長不下降子串行

最長上公升子串行 include includeusing namespace std const int n 23333 12 int dp n a n int n int binarysearch int k,int len else if k dp mid else mid l r 1 ret...

nlogn求最長上公升子串行或最長下降子串行

思路很簡單,維護乙個長度為k時的最長上公升子串行結尾元素是d k 的陣列,因為前面的元素已經插入了,後面的元素對前面的只有更優的影響,所以只掃一遍原陣列就能求得。推薦看這篇部落格 講得很詳細 include using namespace std const int n 1e5 7 int a n ...