小A买彩票

小A买彩票

https://ac.nowcoder.com/acm/problem/23413

线性DP
dp[i][j]表示前i张彩票中奖j元的方案数
那么易得转移方程
dp[i][j] += dp[i-1][j-k] 其中1≤k≤4 k≤j
边界为dp[0][0]
买n张彩票,每张彩票有四种情况,总的方案数就是sum=4^n
所以计算出来ans=sum(dp[n][k]) 其中k>=3n
答案就是ans/sum
注意约分即可。

#include<bits/stdc++.h>
using namespace std;
typedef  long long ll;
ll dp[35][150];///对于前i张中奖j元的方案数
int main(){
    ll n;cin>>n;
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=4*i;j++){
            if(j>=1) dp[i][j] += dp[i-1][j-1];
            if(j>=2) dp[i][j] += dp[i-1][j-2];
            if(j>=3) dp[i][j] += dp[i-1][j-3];
            if(j>=4) dp[i][j] += dp[i-1][j-4];
        }
    }
    ll ans=0;
    for(int i=3*n;i<=4*n;i++) ans += dp[n][i];
    ll sum=((ll)1<<(n<<1));
    cout<<ans/__gcd(ans,sum)<<"/"<<sum/__gcd(ans,sum)<<endl;
    return 0;
}
每日一题 文章被收录于专栏

每日一题专栏

全部评论
我感觉我用背包的思想理解了这个线性dp...
点赞 回复 分享
发布于 2022-07-13 21:28
Orzzz %%%%%%
点赞 回复 分享
发布于 2022-07-13 20:54

相关推荐

脾气小祖宗:这简历摸到都得狠狠地消毒液洗手😂
点赞 评论 收藏
分享
评论
12
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务