12034 - Race(递推)

搞了快一个月的高效和动归了, 太费脑子,水一道数学~

该题是递推题,动归没白搞,很快就写出来了 。 现在有点明白为什么比赛要测试栈深了,递归的应用实在是太多了 。

一般对某数取模是因为答案太大会爆long long  , 至于为什么要对这么奇怪的一个数取模,好像是因为这样答案离散的比较好?有清楚的朋友希望不吝赐教 !

代码如下:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int T,n,maxn;
ll d[1005],c[1005][1005],kase=0;
ll dp(int m) {
    if(m == 0) return 1;
    ll& ans = d[m];
    if(d[m] != -1) return ans;
    ans = 0;
    for(int i=1;i<=m;i++) {
        ans += (c[m][i] * dp(m-i));
    }
    return ans %= 10056;
}
int main() {
    scanf("%d",&T);
    memset(d,-1,sizeof(d));
    for(int i=0;i<=1002;i++) {
            c[i][0] = 1;
            for(int j=1;j<=i;j++) c[i][j] = (c[i-1][j-1] + c[i-1][j])%10056;
    }
    while(T--) {
        scanf("%d",&n);
        printf("Case %d: %lld\n",++maxn,dp(n));
    }
    return 0;
}

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

时间: 2024-10-20 18:06:52

12034 - Race(递推)的相关文章

UVA 12034 - Race(递推)

UVA 12034 - Race 题目链接 题意:给定n匹马,要求出可能的排名情况(可能并列) 思路:递推,dp[i][j]表示i匹马的时候有j种不同名次,那么dp[i][j]可以由dp[i - 1][j - 1]插入j个不同位置得来,或者由dp[i - 1][j]放入已有j的名次得来,得到递推式dp[i][j] = j * (dp[i - 1][j - 1] + dp[i - 1][j]); 然后对于n的答案为sum{dp[n][j]} (1 <= j <= n) 代码: #include

UVA 12034(递推&amp;递归_I题)解题报告

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3185 -----------------------------------------------------------------------------------------------------------------------------------------

UVA 12034 Race (递推神马的)

Disky and Sooma, two of the biggest mega minds of Bangladesh went to a far country. They ate, coded and wandered around, even in their holidays. They passed several months in this way. But everything has an end. A holy person, Munsiji came into their

UVa 12034 Race (递推+组合数学)

题意:A,B两个人比赛,名次有三种情况(并列第一,AB,BA).输入n,求n个人比赛时最后名次的可能数. 析:本来以为是数学题,排列组合,后来怎么想也不对.原来这是一个递推... 设n个人时答案为f(n)假设第一名有i(0< i <= n)个人,也就是有C(n, i)种,还剩下f(n-i)种可能,然后就so easy了. f(n) = ΣC(n, i)f(n-i). 代码如下: #include <iostream> #include <cstdio> #include

LightOJ - 1038 Race to 1 Again 递推+期望

题目大意:给出一个数,要求你按一定的规则将这个数变成1 规则如下,假设该数为D,要求你在[1,D]之间选出D的因子,用D除上这个因子,然后继续按该规则运算,直到该数变成1 问变成1的期望步数是多少 解题思路:递推,设该数为D,有N个因子,分别是1,n1,n2,n3-nn-2,D, 那么选到每个因子的概率都是1/N,除非选到D,不然选到其他因子的话都要多1步,然后再计算D除以该因子的期望 这就能得到公式了,设dp[D]为数D按规则变成1的期望步数 那么dp[D] = 1/N * (dp[D/1]

【UVA】12034-Race(递推,组合数打表)

递推公式,假设第一名有i个人并列,那么: f[n] = C(n,i) * f[n - i]; 打出1 ~ 1000的所有组合数,之后记忆化搜索,需要打表. 14026995 12034 Race Accepted C++ 0.032 2014-08-12 11:47:47 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector&g

hdu 1207 汉诺塔II (DP+递推)

汉诺塔II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4529    Accepted Submission(s): 2231 Problem Description 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往

hdu 1267 递推

下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4326    Accepted Submission(s): 2268 Problem Description 2005年11月份,我们学校参加了ACM/ICPC 亚洲赛区成都站的比赛,在这里,我们获得了历史性的突破,尽管只是一枚铜牌,但获奖那一刻的激动,也许将永远铭刻

hdu 2067(递推或卡特兰数【待补充】)

//解法一:递推#include<iostream> using namespace std; long long d[36][36]; int main() { for(int i=1;i<=35;i++) { d[0][i]=1; } for(int i=1;i<=35;i++) for(int j=i;j<=35;j++) { if(i==j) d[i][j]=d[i-1][j]; else d[i][j]=d[i-1][j]+d[i][j-1]; } int n; i