zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 20 E

    传送门

    题意

    Roma在玩一个游戏,一共玩了n局,赢则bourle+1,输则bourle-1,Roma将会在以下情况中退出
    1.他赢了k个bourle
    2.他输了k个bourle
    现在给出一个字符串
    'L':lose
    'W':win
    '?':任意
    'D':平局
    输出一个字符串满足条件(Roma n局后离开要满足上述两个其中之一)

    分析

    dp题
    令dp[i][j]表示进行i-1局比赛后,是否获得j个bourle。
    如果第i局为'W': dp[i+1][j+1]=j;
    如果第i局为'L':dp[i+1][j-1]=j;
    如果第i局为'D':dp[i+1][j]=j;
    如果第i局为'?':上面三个都要进行
    一开始dp[0][1500]=0
    最后从n-1到0,比较dp[i][f]与f,f一开始是1500±k,f=dp[i+1][f]
    回溯判断输出

    trick

    代码

    #include<cstdio>
    #include<string>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    string s;
    int dp[1010][3030];
    int n,k;
    int main()
    {
        cin>>n>>k>>s;
        for(int i=0;i<1010;++i)for(int j=0;j<3030;++j) dp[i][j]=-1;
        dp[0][1500]=0;
        for(int i=0;i<n;++i)
            for(int j=1500-k+1;j<=1500+k-1;++j)
            {
                if(dp[i][j]==-1)continue;
                if(s[i]=='W'||s[i]=='?') dp[i+1][j+1]=j;
                if(s[i]=='L'||s[i]=='?') dp[i+1][j-1]=j;
                if(s[i]=='D'||s[i]=='?') dp[i+1][j]=j;
            }
            if(dp[n][1500+k]==-1&&dp[n][1500-k]==-1) { puts("NO");return 0; }
            int f=1500+k;
            if(dp[n][1500+k]==-1) f=1500-k;
            for(int i=n-1;i>=0;--i)
            {
                int g=f;f=dp[i+1][f];
                if(g-f==1) s[i]='W';
                if(g-f==0) s[i]='D';
                if(g-f==-1) s[i]='L';
            }
            cout<<s<<endl;
            return 0;
    }
    
  • 相关阅读:
    世界排名第二的web前端框架bulma与Bootstrap框架的选择
    Bootstrap5中文手册翻译完毕
    RabbitMQ 学习一 了解+点对点模式
    仿京东搜索
    ES集成SpringBoot
    ElasticSearch
    权限管理整合springsecurity代码执行过程
    权限管理
    Gateway网关
    canal数据同步 客户端代码实现
  • 原文地址:https://www.cnblogs.com/chendl111/p/6789257.html
Copyright © 2011-2022 走看看