题意:给你m个H和n个D,然后从左开始数H的累积个数总是不比D的累计数少的排列有多少种,例如:3个H和1个D总共有3种排列,依次是:H D H H,H H D H,H H H D三种排列。
解题思路:假设这些串由m个H,和n个D所构成,那必然可以拆分成两个子问题.即组成的字符串最后一个字符是H还是D。如果是H则,这些串的个数和 m-1个H 和 n 个D构成的串的个数相等.如果为D则,这些串的个数和 m个H 和 n-1 个D构成的串的个数相等.所以 m个H和n个D 构成的串的个数 = m-1个H和n个D构成的串的个数 + m个H和n-1个D构成的串的个数;dp的转移方程式为 arr[i][j] = arr[i-1][j] + arr[i][j-1]; // i,j为H,D的数量.
Code:
#include<stdio.h>
int main()
{
__int64 a[21][21];
int m,n,i,j,k;
for(i=0;i<21;i++)
a[i][0]=1;
a[0][1]=0;
for(j=1;j<21;j++)
for(k=1;k<21;k++)
{
if(j<k)
a[j][k]=0;
else
a[j][k]=a[j-1][k]+a[j][k-1];
}
while(scanf("%d%d",&m,&n)!=EOF)
printf("%I64d\n",a[m][n]);
return 0;
}