計算整數集合滿足下列條件的的排列個數:
在位置a1, a2, ..., ak小於其鄰居(編號從0開始)。
在位置b1, b2, ..., bl大於其鄰居。
輸出符合條件的排列數量mod 1000000007的結果。例如:n = 4,a = , b = ,符合條件的排列為:
2 1 4 3
3 2 4 1
4 2 3 1
3 1 4 2
4 1 3 2
input
第1行:3個數n, k, l,分別表示陣列的長度,限制a的長度,限制b的長度(1 <= n <= 5000, 1 <= k, l <= n)。
第2 - k + 1行:每行乙個數,對應限制a的位置(1 <= ai <= n - 2)
第k + 2 - k + l + 1行:每行乙個數,對應限制b的位置(1 <= bi <= n - 2)
output
輸出符合條件的排列數量mod 1000000007的結果。
input示例
4 1 1
12
output示例
5
思路:
數字dp。
dp[i][j]表示前i位並且最後一位值為j時的排列方式數量。
sum[i]表示前一輪最後一位小於等於i時的排列方式數量。
#include #include #include using namespace std;
const int maxn = 5e3 + 10;
const int mod = 1e9 + 7;
int n, k, l;
int state[maxn], sum[maxn];
int dp[maxn][maxn];
int main()
for (int i = 0; i < l; i++)
sum[0] = 0;
dp[1][1] = sum[1] = 1;
for (int i = 2; i <= n; i++)
else if (state[i] == 1)
else
}for (int k = 1; k <= i; k++)
}cout << sum[n] << endl;
return 0;
}
51Nod 1296 有限制的排列
acm模版 個人感覺,這個應該算是數字 dp。先通過處理輸入資料獲取乙個 state,表示每相鄰兩項之間的大小關係,state i 0,表示無特別關係,state i 1 表示第 i 項小於第 i 1 項,state i 2 表示第 i 項大於第 i 1 項。接著搞乙個 dp i j 表示由前 i ...
51Nod 1296 構造排列 DP
題目鏈結 題意 給定n,要求構造滿足要求的排列,對於其中的一些成員,值大於左右鄰居,對於另一些成員,值小於左右鄰居。輸出滿足條件的排列種數。思路 設dp i j dp i j dp i j 為前i ii 個數構成的滿足條件的合法排列,且末尾為j jj的個數。那麼對於第i ii個數,我們只需要考慮其與...
51nod 1934 受限制的排列
這題還要判無解真是難受 我們發現我們肯定能確定1的位置,1左右的兩個區間是同理的可以確定出最小值的位置 我們把區間最小值看成給乙個區間 1,構建出笛卡爾樹,就求出了每一次取最小值和最小值左右的區間大小 然後就相當於左右子樹的排列方式,乘上把左右子樹那麼多個元素選出左子樹個數和右子樹個數那麼多的方案數...