【BZOJ1599】[Usaco2008 Oct] 笨重的石子

描述 Description

贝西喜欢棋盘游戏和角色扮演类游戏所以她说服 Farmer John 把她带到玩具店,在那里,她购买了三个不同的骰子,这三个质量均匀的骰子,分别有 S1,S2,S3 个面。(2 <= S1 <= 20; 2 <= S2 <= 20; 2 <= S3 <= 40). 贝西掷啊掷啊掷啊,想要知道出现几率最大的和是多少。 问题给出三个骰子的面数,让你求出出现几率最大的和是多少。如果有很多种和出现的几率相同,那么就输出小的那一个。

输入格式 InputFormat

第一行:三个由空格隔开的整数:s1,s2,s3.

输出格式 OutputFormat

第一行:所要求的解.

样例输入 SampleInput

20 20 40

样例输出 SampleOutput

41

来源 Source

资格赛​


BZOJ 1599


代码 Code

f[i][j] 表示用前 i 个骰子出现和为 j 的次数 (?).

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int f[4][100];
int i,j,t,n,m,l,r,k,z,y,x,ans;
int main()
{
    scanf("%d%d%d",&x,&y,&z);
    for (i=1;i<=x;i++) f[1][i]=1;
    for (i=1;i<=x+y;i++) for (j=1;j<=y;j++)
    {
        if (i>j) f[2][i]+=f[1][i-j];
    }
    for (i=1;i<=x+y+z;i++) for (j=1;j<=z;j++)
    {
        if (i>j) f[3][i]+=f[2][i-j];
    }
    ans=0;
    for (i=1;i<=x+y+z;i++) if (f[3][ans]<f[3][i]) ans=i;
    printf("%dn",ans);
    return 0;
}