码迷,mamicode.com
首页 > 其他好文 > 详细

Ural1114 Boxes【DP】

时间:2015-08-14 21:26:31      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.timus.ru/problem.aspx?space=1&num=1114


题目大意:

有N个盒子,有红色和蓝色两种颜色的球。红球有A个,篮球有B个。现在随意的向盒子里放球,

每个盒子可以放一种颜色的球,也可以放两种颜色的球,也可以不放球。问:总共有多少种方法。


解题思路:

用DP来做。设dp[i][j][k]表示到第i个盒子为止,用了j个红球和k个篮球。

则dp[i][j][k] = Σ(dp[i-1][jj][kk])(j <= jj <= A,k <= kk <= B)。

则最终结果为Σdp[N][j][k](0 <= j <= A,0 <= k <= B)。

注意:这题long long都不够,需要用unsigned long long。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL unsigned long long
//define LL long long 不可以
using namespace std;

LL dp[25][25][25];

int main()
{
    int N,A,B;
    while(~scanf("%d%d%d",&N,&A,&B))
    {
        memset(dp,0,sizeof(dp));
        dp[0][A][B] = 1;
        LL ans = 0;

        for(int i = 1; i <= N; ++i)
        {
            for(int j = 0; j <= A; ++j)
            {
                for(int k = 0; k <= B; ++k)
                {
                    for(int jj = j; jj <= A; ++jj)
                        for(int kk = k; kk <= B; ++kk)
                            dp[i][j][k] += dp[i-1][jj][kk];
                    if(i == N)
                        ans += dp[i][j][k];
                }
            }
        }

        printf("%I64u\n",ans);
    }

    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

Ural1114 Boxes【DP】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/47667693

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!