NYOJ--743

 拿到這個題找規律找了好久...畫了半天才發現規律...結果網上一搜..就是C(M,N)的求取啊..坑啊..

 先說簡單的思路..循環的遞增其實就是從一個長度爲n的遞增序列,然後每個數都不一樣,從中找出m個數..所以直接就是C(M,N)...

 而且用C(M,N)公式計算的話還是複雜了.可以直接用C(M,N)=C(M,N-1)+C(M-1,N-1)來算出一張表來..每次輸入直接在表中查找即可..當然這是別人的思路..


 我還是說下我找的規律吧..

 一開始看半天,也寫不出公式..於是選擇按照<怎樣解題>的思路來..先自己從簡單的情況慢慢找...盡信書不如無書啊...

  1.當m==1的時候,很顯然次數爲n

  2.當m==2的時候,算出每次第一層循環變化時候第二層循環中執行的次數,可以看出是從n-1一直累加到1.

  3.當m>=3的時候計算的情況就變了.就從一維的變爲多維的了.爲了方便說,就以m==3來說.每排都是由最下面兩層循環計算的,然後再多一層,那麼就會多一排出來.所以可以看做是二維的.同理,當m==4的時候,最下面三排構成一個二維的..然後最上面排構成第三個維度..這就是遞歸的神奇之處吧!下一個維度由多個上一維度組成.於是就可以看成是一個動態規劃的問題了..

 貌似說的有些複雜..還是貼出別人思路的代碼吧..自己寫的..雖然差不多...


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

int map[2001][2001]; 


int main()
{
	int i,j;
	int n,m;
	int fenzi,fenmu;

	for(i=1;i<=2000;i++)
	{
		for(j=i;j<=2000;j++)
		{
			if(i==1)
			{
				map[i][j]=j%1009;
			}
			else if(i==j)
			{
				map[i][j]=1;
			}
			else
			{
				map[i][j]=map[i][j-1]+map[i-1][j-1];
				map[i][j]%=1009;
			}
		}
	}

	while(scanf("%d %d",&m,&n))
	{	
		if(m+n==0)
			break;
		printf("%d\n",map[m][n]);
	}
}        


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