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

HDU ACM 1267 下沙的沙子有几粒?->DP

时间:2015-03-16 14:34:35      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:acm   c++   算法   编程   c   

题意:m个H和n个D,从左开始数H的累积个数总不比D的累计数少的排列有多少种。例如,3个H和1个D共有3种符合要求的排列H D H H,H H D H,H H  H D。
分析:状态方程为,DP[m][n]=DP[m-1][n]+DP[m][n-1]。另外当n=0的时候无论m如何取值都是1。

理解:假设3个H和2个D是由2个H和2个D还有3个H一个D推来的,2个H和2个D共有H D H D,H H D D两种排列,3个H和一个D总共有H D H H,H H D H,H H  H D三种排列,然后在H D H D,H H D D的后面添加一个H就是2中排列,在H D H H,H H D H,H H  H D的后面添加一个D就有3种方案,所以总共就是5种方案,其他均为重复。

注意:m<n的话排列的情况不存在,则为0。

#include<iostream>   
using namespace std;

int main()  
{
	__int64 a[21][21];
	int m,n,i,j;

	memset(a,0,sizeof(a));
	for(i=1;i<=20;i++) //当n为0的时候无论m如何取何值都是1
		a[i][0]=1;

	for(i=1;i<=20;i++)
		for(j=i;j<=20;j++)
			a[j][i]=a[j-1][i]+a[j][i-1];

	while(cin>>m>>n)
	{
		printf("%I64d\n",a[m][n]);
	}
    return 0;  
}


HDU ACM 1267 下沙的沙子有几粒?->DP

标签:acm   c++   算法   编程   c   

原文地址:http://blog.csdn.net/a809146548/article/details/44304349

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