UVa 10721 - Bar Codes

来源:互联网 发布:东京著衣淘宝店怎么了 编辑:程序博客网 时间:2024/05/29 16:28

題目:給你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;}


0 1
原创粉丝点击