2018牛客多校第一場 E Removal dp

2022-02-03 23:17:50 字數 1223 閱讀 1710

**:戳這裡

題意:長度為n的序列,刪掉m個數字後有多少種不同的序列。

n<=10^5,m<=10。

題解:dp[i][j]表示加入第i個數字後,總共刪掉j個數字時,有多少種不同的序列。

假設不考慮有重複的情況,dp方程為:dp[i][j]=dp[i-1][j] (第i個數字不刪)+dp[i-1][j-1] (第i個數字刪)。

現在考慮重複的情況。

如果前面有與a[i]相同的數字a[k] (k小於i),並且i-k<=j,就會產生重複。

比如:cdeaae(用字串舉例比較方便)

假設現在是i=6,j=4。那麼我們需要dp[6][4]-dp[2][1]。

那麼為什麼不是減掉dp[3][1]呢。

因為dp[3][1]=dp[2][1]+dp[2][0],也就是說dp[3][1]還包括了刪掉a[3]的狀態,而如果刪掉a[3],那麼加入a[6]的時候就不會有重複了。所以減掉dp[2][1],就是減掉了a[3]不刪除的情況。

附ac**:

1 #include2 #include3 #include4 #include

5 #include6 #include7 #include8 #include9

using

namespace

std;

10 typedef long

long

ll;11

const ll mod = 1e9 + 7;12

const

int maxn = 1e5 + 10;13

const

int maxx = 2 *1e3;

14int

nu[maxn];

15int pos[11

];16

intpre[maxn];

17 ll dp[maxn][11

];18

intmain()

1932

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

3336

for(int i = 0; i <= m; ++i)

3740

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

4150}51

}52 printf("

%lld\n

", dp[n][m]);53}

54return0;

55 }

view code

2018 牛客多校第一場J

題意 就是給了乙個陣列a,和q個查詢l,r,問 a1 al,ar an中有多少個不同的數字 題解 首先把陣列a拷貝乙份拼接起來,這樣兩個區間 a1 al,ar an 就合併成乙個區間 ar al n 之後就是問區間上不同的數字個數,經典的題方法看這個 在陣列上將數字i出現最後乙個位置 置為1,然後就...

2018 牛客多校第一場 D

題目 題意 給你乙個小圖,乙個大圖。問你在大圖中能找到多少個形狀和小圖一樣的。思路 因為n為8,我們可以暴力找,全排列把所有情況找到,再把可行的狀態用二進位制表示,用map對映防止重複 includeusing namespace std define ll long long int mp1 11...

2018牛客多校第一場 dp Removal

參考部落格 題意 乙個陣列s,長度為n n 1e5 陣列元素s i 10,要求從中刪除m m 10 個數字,求能得到多少個不重複的結果,mod 1e9 7 思路 注意坑點在二維陣列的初始化,直接 szieof dp 是不行的 還有取模也需要略微注意,只要遇到減法,就要進行先加後取模。include ...