CodeForces 712 D.Memory and Scores(dp)

本文介绍了一个游戏得分策略问题,通过动态规划求解Memory与Lexa进行游戏后Memory得分高于Lexa的概率。阐述了如何利用dp[i][j]表示第i轮后得分差为j的方案数,并介绍了状态转移方程及优化后的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Memory和他的朋友Lexa玩游戏,起始两人分数分别为a,b,每轮游戏,两人得分为[k,k]中的一个随机数,问t轮后Memory得分比Lexa分数高的方案数

Input

四个整数a,b,k,t(1a,b100,1k1000,1t100)

Output

输出方案数,结果模109+7

Sample Input

1 2 2 1

Sample Output

6

Solution

dp[i][j]表示前i轮分差为j的方案数,枚举第i轮的分差l有转移

dp[i][j]==l=02k(2k+1l)dp[i1][jl]+l=2k1(2k+1+l)dp[i1][jl]dp[i][j1]l=12k+1dp[i1][jl]+2k0dp[i1][jl]

故只要维护dp[i1]的前缀和每次就可以O(1)转移,时间复杂度O(t2k),答案即为i>badp[t][i]

Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=420000;
#define mod 1000000007
int a,b,k,t,dp[2][maxn],sum[maxn];
int n=400000,m=200000;
void add(int &x,int y)
{
    x=x+y>=mod?x+y-mod:x+y;
}
int Solve(int l,int r)
{
    l=max(1,l),r=min(r,n);
    return (sum[r]-sum[l-1]+mod)%mod;
}
int main()
{
    scanf("%d%d%d%d",&a,&b,&k,&t);
    int cur=0;
    dp[cur][m]=1;
    for(int i=1;i<=t;i++)
    {
        cur^=1;
        memset(dp[cur],0,sizeof(dp[cur]));
        sum[0]=dp[cur^1][0];
        for(int j=1;j<=n;j++)sum[j]=(sum[j-1]+dp[cur^1][j])%mod;
        for(int j=0;j<=n;j++)
        {
            if(j==0)
            {
                for(int l=0;l<=2*k;l++)
                    add(dp[cur][j],(ll)(2*k+1-l)*dp[cur^1][j+l]%mod);
            }
            else
            {
                dp[cur][j]=dp[cur][j-1];
                add(dp[cur][j],mod-Solve(j-2*k-1,j-1));
                add(dp[cur][j],Solve(j,j+2*k));
            }
        }
    }
    int ans=0;
    for(int i=m+1+b-a;i<=n;i++)add(ans,dp[cur][i]);
    printf("%d\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值