最長下降序列 中高階

2022-04-19 04:26:14 字數 1954 閱讀 7948

description

給你一串整數,從左到右按順序挑出一些數字,構成嚴格下降序列,問最長能構成多長

如6個數4 5 2 4 2 2, 那麼最長可以挑出5 4 2,長度為3

input

首先輸出t(t<=50),表示有t組資料。 

每組資料: 

首先輸入n表示有幾個數(1output

對於每個樣例輸出乙個數字,表示最長的長度

sample input

1

64 5 2 4 2 2

sample output

3

這題可以當模板用,用了類似單調佇列的思想。

模板1:嚴格下降子串行

#include#include#includeusing namespace std;

#define maxn 100030

int a[maxn],dp[maxn];

int findx(int l,int r,int x)

else r=mid-1;

}return l;

}int main()

len=1;dp[1]=a[1];

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

else r=mid-1;

}return l;

}int main()

len=1;dp[1]=a[1];

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

j=findx(1,len,a[i]);

dp[j]=a[i];

}printf("%d\n",len);

}return 0;

}

模板3:可以用upperbound(非嚴格上公升子串行),lower_bound(嚴格上公升子串行)。

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 100030

#define ll long long

#define inf 0x7fffffff

int a[maxn],dp[maxn];

int main()

len=1;dp[1]=a[1];

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

j=lower_bound(dp+1,dp+1+len,a[i])-dp;//嚴格上公升

dp[j]=a[i];

}printf("%d\n",len);

}return 0;

}

模板4:用線段樹來查詢

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define maxn 10100

#define inf 999999999

int c[maxn];

struct node1a[maxn];

bool cmp(node1 a,node1 b)

}int main()

reverse(c+1,c+1+n);

for(i=1;i<=n;i++)

sort(a+1,a+1+n,cmp);

build(1,10050,1);

int maxx=0;

for(i=1;i<=n;i++)

printf("%d\n",maxx);

}return 0;

}

最長下降序列 中高階

description 給你一串整數,從左到右按順序挑出一些數字,構成嚴格下降序列,問最長能構成多長 如6個數4 5 2 4 2 2,那麼最長可以挑出5 4 2,長度為3 input 首先輸出t t 50 表示有t組資料。每組資料 首先輸入n表示有幾個數 1 後面一行跟著n個整數 output 對於...

最長不下降子串行

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...

求最長不下降序列

求最長不下降序列 time limit 1000ms memory limit 65536k total submit 398 accepted 171 description 設有n n 1000 個不相同的整數 小於32767 組成的數列,記為 a1,a2,an,其中任意兩個數不相同。例如 3,...