題目:給你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;
}
原文:http://blog.csdn.net/mobius_strip/article/details/45092387