HDU4689Derangement 動態規劃

2022-09-17 11:39:16 字數 807 閱讀 4314

題意:對於乙個由1~n組成的長度為n的序列來說它有n!種排法。我們定義初始的排列為1,2,3,...,n對於興許的排列假設a[i]>i則用'+'表示。a[i]

分析:設dp[i][j]表示前i個字元中有j個'+'沒有排,'-'排完了的方案數。

那麼我們能夠依據字元的正負分成兩種情況來考慮。

1.a[i]='+':那麼一種情況就是前面有j-1個加號沒有放,並且這個加號也不放。或者前面已經有j個加號沒有放。那麼我們這個加號假設也不放的話就要把這個數放在前面j個加號沒有放的位置上,有j種可能。

因此這時dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j.

2.a[i]='-':相同的一種情況就是前面已經有j+1個加號,我們須要把前面這個數放在前面的加號沒有放的位置,又要從前面加號沒有放的位置選乙個放在這個位置一共j*j種方案。另一種是假設前面有j個加號沒有放的話我們就僅僅須要從這j個數種選乙個放在這個位置上就可以。,因此此時dp[i][j]=dp[i-1][j+1]*j*j+dp[i-1][j]*j;

**例如以下:

#include #include #include #include using namespace std;

const int maxn = 30;

typedef long long ll;

ll dp[maxn][maxn];

char s[maxn];

int main()

}if(s[i-1]=='-')}}

printf("%i64d\n",dp[len][0]);

}return 0;

}

hdu1285 hdu4857 拓撲排序

一 原題內容 problem description 有n個比賽隊 1 n 500 編號依次為1,2,3,n進行比賽,比賽結束後,裁判委員會要將所有參賽隊伍從前往後依次排名,但現在裁判委員會不能直接獲得每個隊的比賽成績,只知道每場比賽的結果,即p1贏p2,用p1,p2表示,排名時p1在p2之前。現在...

樹狀陣列 hdu2689 hdu2838

題意 給定乙個正整數n,和乙個1 n的乙個排列,每個數可以和旁邊的兩個數的任意乙個交換,每交換一次總次數就要加一,問將這個排列轉換成乙個遞增的排列需要多少次交換?題意可以轉換成求這個排列的逆序對數。include include include include using namespace std...

hdu2068 hdu 2049 錯排組合

這部分涉及的知識為組合數和錯排 參考 比較簡單 hdu2068 include include int64 c int n,int m 組合數公式 return u d main sum for i 3 i 13 i f i i 1 f i 1 f i 2 while scanf d n n 另一題...