zoukankan      html  css  js  c++  java
  • CF296B Yaroslav and Two Strings(DP)

    题意翻译

    如果两个只包含数字且长度为 nn 的字符串 ss 和 ww 存在两个数字 1leq i,jleq n1i,jn,使得 s_i<w_i,s_j>w_jsi<wi,sj>wj,则称 ss 和 ww 是不可比的。现在给定两个包含数字和问号且长度为 nn 的字符串,问有多少种方案使得将所有问号替换成0到9的数字后两个字符串是不可比的?

    题解:

    /*
     *CF296B
     *线性DP
     *dp(i,k)表示遍历到第i位两个字符串的状态
     *k=0:前面没有大于或小于
     *k=1:前面只有大于
     *k=2:前面只有小于
     *k=3:前面既有小于又有大于
     */
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2e5+100;
    const int mod=1e9+7;
    typedef long long ll;
    ll dp[maxn][4];
    int n;
    string s,t;
    int main () {
        scanf("%d",&n);
        cin>>s>>t;
        dp[0][0]=1;
        for (int i=1;i<=n;i++) {
            if (s[i-1]!='?'&&t[i-1]!='?') {
                if (s[i-1]==t[i-1]) {
                    dp[i][0]=dp[i-1][0];
                    dp[i][1]=dp[i-1][1];
                    dp[i][2]=dp[i-1][2];
                    dp[i][3]=dp[i-1][3];
                }
                else if (s[i-1]<t[i-1]) {
                    dp[i][0]=0;
                    dp[i][1]=0;
                    dp[i][2]=dp[i-1][2]+dp[i-1][0];dp[i][2]%=mod;
                    dp[i][3]=dp[i-1][3]+dp[i-1][1];dp[i][3]%=mod;
                }
                else if (s[i-1]>t[i-1]) {
                    dp[i][0]=0;
                    dp[i][1]=dp[i-1][0]+dp[i-1][1];dp[i][1]%=mod;
                    dp[i][2]=0;
                    dp[i][3]=dp[i-1][2]+dp[i-1][3];dp[i][3]%=mod;
                }
            }
            else if (s[i-1]=='?'&&t[i-1]!='?') {
                int t1='9'-t[i-1];
                int t2=t[i-1]-'0';
                dp[i][0]=dp[i-1][0];
                dp[i][1]=dp[i-1][1]*(t1+1)%mod+dp[i-1][0]*t1%mod;dp[i][1]%=mod;
                dp[i][2]=dp[i-1][2]*(t2+1)%mod+dp[i-1][0]*t2%mod;dp[i][2]%=mod;
                dp[i][3]=dp[i-1][1]*t2%mod+dp[i-1][2]*t1%mod+dp[i-1][3]*10%mod;dp[i][3]%=mod;
            }
            else if (s[i-1]!='?'&&t[i-1]=='?') {
                int t2='9'-s[i-1];
                int t1=s[i-1]-'0';
                dp[i][0]=dp[i-1][0];
                dp[i][1]=dp[i-1][1]*(t1+1)%mod+dp[i-1][0]*t1%mod;dp[i][1]%=mod;
                dp[i][2]=dp[i-1][2]*(t2+1)%mod+dp[i-1][0]*t2%mod;dp[i][2]%=mod;
                dp[i][3]=dp[i-1][1]*t2%mod+dp[i-1][2]*t1%mod+dp[i-1][3]*10%mod;dp[i][3]%=mod;
            }
            else {
                int t1=45;
                int t2=45;
                int t3=10;
                dp[i][0]=dp[i-1][0]*t3;
                dp[i][1]=dp[i-1][1]*(t1+t3)%mod+dp[i-1][0]*t1%mod;dp[i][1]%=mod;
                dp[i][2]=dp[i-1][2]*(t2+t3)%mod+dp[i-1][0]*t2%mod;dp[i][2]%=mod;
                dp[i][3]=dp[i-1][1]*t2%mod+dp[i-1][2]*t1%mod+dp[i-1][3]*(t1+t2+t3)%mod;dp[i][3]%=mod;
            }
        }
        printf("%lld
    ",dp[n][3]);
    } 
  • 相关阅读:
    HDU3440 House Man (差分约束)
    POJ1201 Intervals (差分约束)
    POJ2154 Color【 polya定理+欧拉函数优化】(三个例题)
    【2018年全国多校算法寒假训练营练习比赛(第三场)】
    数据人看Feed流-架构实践
    开源背后 | 面对端侧推理引擎的挑战,阿里工程师如何应对?
    容器十年 ——一部软件交付编年史
    公网对讲行业大咖分享:铁通电子为何选择阿里云?
    逾期率飙升如何破?揭秘金融科技如何化解消费金融行业风险
    微服务开源生态报告 No.2
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/13479361.html
Copyright © 2011-2022 走看看