[Usaco2008 Oct]笨重的石子 DP

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


这题按理来说用随机算法也应该能过。

不过我试了却没过。


标准的算法是算出组成每个数的方案数, 然后最大的即为所求


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <map>
#include <set>
#define MAXN 51111
#define MAXM 555
#define INF 1000000007
using namespace std;
int f[4][86];
int main()
{
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    for(int i = 1; i <= a; i++) f[1][i] = 1;
    for(int i = 1; i <= a + b; i++)
        for(int j = 1; j <= b; j++)
            if(i > j) f[2][i] += f[1][i - j];
    for(int i = 1; i <= a + b + c; i++)
        for(int j = 1; j <= c; j++)
            if(i > j) f[3][i] += f[2][i - j];
    int ans = 0;
    for(int i = 1; i <= a + b + c; i++)
        if(f[3][ans] < f[3][i])
            ans = i;
    printf("%d\n", ans);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值