hdu 1502 Regular Words

Regular Words

http://acm.hdu.edu.cn/showproblem.php?pid=1502


题目其实就是一个排列组合的问题

有n个ABC 排列有多少种排列方式 但是得保证 排列之后都能拆成ABC的模式 必须是按顺序的

排列到最后又转化成了dp的问题

最后总结出来一个公式

dp[i][j][k] = dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1]

其中 i >= j >= k

这个题目的输出格式貌似有问题

直接上代码 

#include"stdio.h"
#include"string.h"
typedef char NUM[100];
NUM dp[61][61][61];
/**
 *  大树相加
 *
 *  @param x 第一个大数
 *  @param y 第二个大数
 */
void add(char *x,char *y)
{
    int i;
    for(i=0;i<99;i++)
    {
        x[i]+=y[i];
        x[i+1]+=(x[i]/10);
        x[i]%=10;
    }
}
int main()
{
    memset(dp,0,61*61*61*sizeof(NUM));
    dp[0][0][0][0]=1;
    
    int A,B,C,n;
    for(A=1;A<=60;A++)
        for(B=0;B<=A;B++)
            for(C=0;C<=B;C++)
            {
                /**
                 *  满足关系式 a >= b >= c 才会计算
                 */
                if(A>B)
                {
                    /**
                     *  当 b < c 的话 dp[A][B][C] = 0;
                     */
                    add(dp[A][B][C],dp[A-1][B][C]);
                }
                if(B>C)
                {
                    /**
                     *  满足这个条件的话,只有  A>= B  dp[A][B][C] 才有值;
                     */
                    add(dp[A][B][C],dp[A][B-1][C]);
                }
                if(C>0)
                {
                    add(dp[A][B][C],dp[A][B][C-1]);
                }
            }
    while(scanf("%d",&n)!=EOF)
    {
        int i=99;
        /**
         *  去除开头的0
         */
        while(dp[n][n][n][i]==0)
            i--;
        while(i>=0)
            printf("%d",dp[n][n][n][i--]);
        printf("\n\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值