有乙個1~n的排列,有以下兩種操作:
drop-2:將倒數第二個數放到開頭,前面的數向後平移
invert:將倒數第二個數放到開頭,前面的數向後平移
若干連續的drop-2稱為multi-drop。
計算要使該排列排成1~n所需的最少的multi-drop的數量。
首先invert可以無條件使用,那麼就可以想到使用multi-drop相當於將乙個數字移動到想移到的地方,如下演示:
4 1 2 3 5 6
invert
⇒
\rightarrow
⇒ 1 2 3 5 6 4
drop-2
∗
*∗ 4 ⇒
\rightarrow
⇒ 5 6 1 2 3 4
invert
⇒
\rightarrow
⇒ 1 2 3 4 5 6
以此類推。
所以所求即為需要移動的最少的數字,也就是n-最長不下降子串行長度。
由於invert操作,需要求n種排列中最大的最長不下降子串行長度。
時間複雜度o(n
3)
o(n^3)
o(n3)或o(n
2log
n)
o(n^2logn)
o(n2lo
gn)
#include
using
namespace std;
int n;
int a[
600]
;int dp[
600]
;int
main()
dp[i]++;
}int maxx=0;
for(
int i=
1;i<=n;i++
) maxx=
max(maxx,dp[i]);
ans=
max(ans,maxx);}
printf
("%d"
,n-ans)
;return0;
}
牛客多校第5場 G題 subsequence1
題意 乙個s的串中有多少個比t大的子串行 不連續的 要取模。題解 純dp的題目。建立乙個三維dp i j 3 i,j代表了s的前i項有多少種子序列能匹配t的前j個數字。最後乙個維度3,代表有三個矩陣,乙個是s的前i項有多少種子序列能大於t的前j個數字 2 乙個是s的前i項有多少種子序列能等於t的前j...
牛客多校第3場 C Shuffle Cards
之所以補這題,是因為第一次使用rope,這是乙個可持久化平衡樹。不過本題沒有用到可持久化就是了,平衡樹的split和merge。include using namespace gnu cxx 下標從0開始,不可以cin,可以cout 由於rope的底層實現,insert,erase,get都是log...
牛客多校(第五場)E room
將乙個房間當做乙個點,後來的房間與之前的房間中不用搬的人作為權值,建圖,跑最大權匹配,就是不用搬的人數,在減一下即可,km演算法,o n 3 include include include includeusing namespace std define n 200 define inf 0x3f...