思路:
沒有感覺特別大的障礙,讀題費了點功夫。要注意一句話:(兩個同樣需求的人(比如都是租鞋或都是還鞋)交換位置是同一種排法)
可以理解為只有m人還鞋,沒有人租鞋的時候,無論這m個人怎么排列都只看作一種方案
遞推方程很好寫:dp[i][j]=dp[i-1][j]+dp[i][j-1],還鞋或者租鞋的人減少一個狀態相加得來
代碼:
#include<iostream>#include<string>#include<cstring>using namespace std;const int MAXN=19;int dp[MAXN][MAXN];void init(){ memset(dp,0,sizeof(dp)); for(int i=0;i<MAXN;i++) dp[i][0]=1;//(兩個同樣需求的人(比如都是租鞋或都是還鞋)交換位置是同一種排法)所以不用求階乘了+_+,想的有點多 for(int i=1;i<MAXN;i++) { for(int j=1;j<MAXN;j++) { if(i>=j) dp[i][j]=dp[i-1][j]+dp[i][j-1]; } }}int main(){ init(); int m,n; scanf("%d%d",&m,&n); PRintf("%d/n",dp[m][n]); return 0;}
新聞熱點
疑難解答