description
給你一串整數,從左到右按順序挑出一些數字,構成嚴格下降序列,問最長能構成多長
如6個數4 5 2 4 2 2, 那麼最長可以挑出5 4 2,長度為3
input
首先輸出t(t<=50),表示有t組資料。
每組資料:
首先輸入n表示有幾個數(1output
對於每個樣例輸出乙個數字,表示最長的長度
sample input
164 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,...