牛客練習賽71 C 數學考試

2021-10-24 15:28:05 字數 1709 閱讀 1621

link

題意:求長度為n的排列有多少個 要求滿足 m個條件 :pi 表示前pi個數不是1~pi的全排列

m第一次遇到這樣的dp狀態-_- 很奇妙。。 它是通過列舉最後乙個不滿足條件的位置來得到答案,所以不會減重複。學到了

2️⃣:常規dp,dp[i][j]表示第i個位置以及之前的數最大值為j的方案數,那麼對於限制條件i我們只需要使dp[p[i]][p[i]]==0後正常轉移即可

#include

#define pb push_back

#define sz(x) ((int)(x).size())

#define all(x) (x).begin(),(x).end()

using

namespace std;

typedef

long

long ll;

typedef vector<

int> vi;

const

int mod =

20000311

;const

int inf =

0x3f3f3f3f

;const

int maxn =

2e6+4;

const

int n =

405;

//ll qpow(ll x, ll y) return ans;}

//ctrl + h ctrl + shift + t

int n,m,p[maxn]

; ll fac[maxn]

,f[maxn]

;int

main()

printf

("%lld\n"

,f[m]);

return0;

}

#include

#define pb push_back

#define sz(x) ((int)(x).size())

#define all(x) (x).begin(),(x).end()

using

namespace std;

typedef

long

long ll;

typedef vector<

int> vi;

const

int mod =

20000311

;const

int inf =

0x3f3f3f3f

;const

int maxn =

2e6+4;

const

int n =

405;

//ll qpow(ll x, ll y) return ans;}

//ctrl + h ctrl + shift + t

int n,m,d,p[maxn]

,a[maxn]

; ll fac[maxn]

,dp[

2020][

2020

],sum[

2020];

intmain()

if(a[i]

) dp[i]

[i]=0;

}printf

("%lld\n"

,dp[n]

[n])

;return0;

}

牛客練習賽71 C 數學考試

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 牛牛在樹剖姐姐的數學考試裡出了乙個題,但是樹剖姐姐不會做,於是她向您求助。求 1 sim n1 n 的排列,有 m 個限制條件,第i個限制條件 p ipi 表示前 ...

牛客練習賽71 C 數學考試 dp

求 1 sim n 的排列,有 m 個限制條件,第 i 個限制條件 p i 表示前 p i 個數不能是 1 sim p i 的排列,求符合要求的排列的個數。答案對 20000311 取模。n le 2000,m,p i 設 dp i j 為滿足限制的情況下放好了排列的前 i 個數且最大值為 j 的方...

牛客 NC15553 數學考試

思路 先把字首和求出來.類似於dp,當前節點為i的時候,我們要記錄下i之前的連續k個數和的最大值lmax.這就是第一段 然後讓j i k,讓rmax a j a i 這樣然後max max max,lmax rmax 這樣的複雜度是o n 看 include include include incl...