題目:給你n個連續排列的長條形單元,單元可以使黑色或或者白色,相鄰的桶重顏色看成是一個部分;
問把n個單元分成k個部分,每個部分都不超過m的分法數。
分析:動態規劃,dp。利用動態規劃建模,找到最後加入的數字和前面集合的關係。
定義狀態:f(i,j,k)為i個單元分成j部分,每部分不超過k個分法數;
轉移方程:f(i,j,k)= sum(f(i-p,j-1,k)) { 1 ≤ p ≤ k};
說明:數據較大哦,注意使用long long防止溢出╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; long long f[55][55][55]; //f(i. j, k) = sum( f(i-p, j-1, k) p = 1..k ) int main() { for (int i = 0; i < 51; ++ i) for (int j = 0; j < 51; ++ j) for (int k = 0; k < 51; ++ k) f[i][j][k] = 0LL; for (int i = 0; i < 51; ++ i) f[0][0][i] = 1LL; for (int i = 1; i < 51; ++ i) for (int j = 1; j < 51; ++ j) for (int k = 1; k < 51; ++ k) for (int p = 1; p <= k && p <= i; ++ p) f[i][j][k] += f[i-p][j-1][k]; int n,k,m; while (cin >> n >> k >> m) cout << f[n][k][m] << endl; return 0; }
时间: 2024-10-11 12:38:38