码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 10721 - Bar Codes

时间:2015-04-17 09:43:08      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

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


UVa 10721 - Bar Codes

标签:

原文地址:http://blog.csdn.net/mobius_strip/article/details/45092387

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!