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;
}

 

posted @ 2013-01-28 16:04  SF-_-  阅读(166)  评论(0编辑  收藏  举报