HDOJ 1267 下沙的沙子有几粒? 简单解题报告
题目很长,也很有趣~当然,题意就是假定一个字符串由m个H和n个D组成,从左到右扫描该串,字符H的累计数总是不小于字符D的累计数,求满足条件的字符串总数。
乍一看挺复杂,像是排列组合什么的。仔细想一想,可以简单的画一个图来解决。
以向右的箭头代表H,右下的箭头代表D,可以得到f(m,n)的表达式:
f(m,n)= f(m-1,n),n=0
f(m,n-1),m==n
f(m,n-1)+f(m-1,n),0<n<m
1,m=n=0
根据递推式写出代码即可。以下是笔者的AC代码:
#include <iostream> using namespace std; int main() { int i,j; long long s[21][21]; s[0][0]=1; for(i=1;i<=20;i++) for(j=0;j<=i;j++) if(j==0) s[i][0]=s[i-1][0]; else if(i==j) s[i][i]=s[i][i-1]; else s[i][j]=s[i][j-1]+s[i-1][j]; while(cin>>i>>j) cout<<s[i][j]<<endl; }