tyvj1208 最長不下降子串行2

2021-07-09 10:31:19 字數 804 閱讀 5184

設有整數序列b1,b2,b3,…,bm,若存在i1第一行為m,表示m個數(m<=900)

第二行m個數

第一行輸出最大長度n

第二行輸出長度為n的序列個數total

1 2 2

1

【題解】

題目描述的是最長上公升子串行

至今仍然覺得這道題的思路很奇怪。在序列的後面加乙個極大的數,其實這是用來存答案的。然後做最長上公升,做完之後尋找答案的過程其實還是乙個dp,由前面的點去擴充套件後面的點。但是要注意的是,如果當前點和後面有乙個點重複,那麼直接退出防止多算(因為對於後面的數來說,前面有兩個一樣的是沒有影響的)

其實也就是說用離他最近的那乙個符合條件的點去擴充套件他。

要注意不能把相同的數的前面那個刪去。反例比如說13235。但是把相鄰的相同的數刪掉是完全可以的。

這道題隔一段時間應該看一看。但是還是覺得時間複雜度十分的不科學

【**】

#include#include#include#include#define inf 2100000000

using namespace std;

int n1,n,max;

int f[1005],a[1005],h[1005],ans[1005];

bool b[1005];

int main()

max--;

printf("%d\n%d\n",max,ans[n]);

}

最長不下降子串行

a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...

最長不下降子串行

最長不下降子串行解法 第一種就是普通的dp方法 for int i 1 i n i dp 0 1 for int i 1 i n i ans max ans,dp i cout 主要記錄一下n logn的寫法 二分 主要思路 用乙個陣列 b 來記錄最長的子串行 一開始讓b 1 a 1 陣列a為輸入的...

最長不下降子串行

例子 openjudge 4977 怪盜基德的滑翔翼 描述怪盜基德是乙個充滿傳奇色彩的怪盜,專門以珠寶為目標的超級盜竊犯。而他最為突出的地方,就是他每次都能逃脫中村警部的重重圍堵,而這也很大程度上是多虧了他隨身攜帶的便於操作的滑翔翼。有一天,怪盜基德像往常一樣偷走了一顆珍貴的鑽石,不料卻被柯南小朋友...