杭電1267 下沙的沙子有幾粒?

題意:就是給你m個H和n個D,然後從左開始數H的累積個數總是不比D的累計數少的排列有多少種舉一個測試案例吧:3個H和1個D總共有3種排列,依次是:H D H H,H H D H,H H  H D三種排列,親~意思應該懂了吧?!呵呵。。。

思路:遞推公式爲: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種方案(其它的添加方法都是重複的,不信的話自己可以試一下)

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	long long a[22][22];
	int m,n;
	memset(a,0,sizeof(a));
	for(int i=1;i<=20;i++)
		a[i][0]=1;
	for(int i=1;i<=20;i++)
		for(int j=i;j<=20;j++)
			a[j][i]=a[j-1][i]+a[j][i-1];
	while(cin>>m>>n){
		cout<<a[m][n]<<endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章