题目大意:输入两个数字m,n,表示H、D的个数。求存在多少个序列使得从左往右数,该序列的H的个数总不小于D的个数。通俗点讲,

就是给你m个H和n个D,然后从左开始数H的累积个数总是不比D的累计数少的排列有多少种举一个测试案例吧:3个H和1个D总共有3种排列,依次是:H D H H,H H D H,H H  H D三种排列,亲~意思应该懂了吧?!呵呵。。。

解题思路:

1)若n为零,不管m取什么值。a[m][n]都为1

2)递推公式为:a[m][n] = a[m-1][n] + a[m][n-1].

3)

思路:递推公式为:a[m][n]=a[m-1][n]+a[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种方案(其它的添加方法都是重复的,不信的话自己可以试一下)


代码如下:

/*
 * 1267_1.cpp
 *
 *  Created on: 2013年8月12日
 *      Author: Administrator
 */

#include <stdio.h>
#include <string.h>

int main(){
	__int64 a[21][21];
	memset(a,0,sizeof(a));
	int i,j;
	for(i = 0 ; i <= 20 ; ++i){
		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];
		}
	}


	int n ,m;
	while(scanf("%d%d",&m,&n)!=EOF){
		printf("%I64d\n",a[m][n]);
	}

}