Jzoj5235 好的排列

2021-08-10 21:22:35 字數 814 閱讀 9727

對於乙個1->n的排列 ,定義a中的乙個位置i是好的,當且僅當ai-1>ai 或者ai+1>ai。對於乙個排列a,假如有不少於k個位置是好的,那麼稱a是乙個好的排列。

現在有q個詢問,每個詢問給定n,k,問有多少排列是好的。答案對10^9+7取模。

顯然是計數類dp,我們設f[i][j]表示對於乙個1->i的排列,好的位置有j個的情況

考慮轉移,顯然f[i][j]->f[i+1][k]相當於插入乙個i+1

那麼我們考慮對j的影響,顯然f[i][j]只能轉移到f[i+1][j]或者f[i][j],因為這取決於你將i+1放在哪個位置上

如果放在乙個不是好位置的兩邊,那麼j就會+1,否則j不變,而且顯然,不好的位置一定不連續(顯然)

那麼轉移就十分簡單了,參考code

#include

#include

#include

#define m 1000000007

#define l long long

using

namespace

std;

void ad(int& x,l y)

int f[3010][3010]=,s[3010][3010]=,n;

int main()

} for(int i=1;i<=3000;++i)

for(int j=i-1;~j;--j)

scanf("%d",&n);

for(int x,y,i=0;iscanf("%d%d",&x,&y);

printf("%d\n",s[x][y]);

}}

Jzoj4209 已經沒有什麼好害怕的了

小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法子串有多少個。空串是乙個...

Jzoj4209 已經沒有什麼好害怕的了

小y 最近開始學習演算法姿勢,但是因為小r 非常bb,給了她很多b6 題,所以她覺得自己已經沒有什麼前途了。於是小r 給了她一些稍微簡單的題,讓她覺得已經沒有什麼好害怕的了,其中一道是這樣的 給定乙個長度為n 只包含左括號和右括號的序列,現在小r 想要知道經過每乙個位置的合法子串有多少個。空串是乙個...

JZOJ 7 9C組第三題 排列的編碼

給出乙個長度為n序列,求出它在n的全排列中是第幾個。這道題要找規律,設ml i ml i 為第i i 位後面有幾個數比第 i role presentation style position relative i i位小,通過一系列操作 詳見某蒟佬 可以得到答案an s an s ml i n i ...