题解 | #小红的01串(五)#

小红的01串(五)

https://ac.nowcoder.com/acm/contest/98256/E

记忆化搜索: 如果不是'?'则正常取余否则就有两种情况?=0或者?=1的情况将两者情况的结果相加得到结果

import java.io.*;
import java.util.*;
 
public class Main {
    static int mod=(int)(1e9+7);
    public static void main(String[] args) {
        char[] c=Str().toCharArray();
        long[][] dp=new long[c.length+1][13];
        for(long[] d:dp){
            Arrays.fill(d,-1L);
        }
        long ans=dfs(c,dp,0,0L)%mod;
        pw.println(ans);
        pw.flush();
    }
    public static long dfs(char[] c,long[][] dp,int i,long x){
        if(i==c.length) return x==0?1:0;
        if(dp[i][(int)x%13]!=-1) return dp[i][(int)x%13];
        long ans=0;
        if(c[i]!='?'){
            ans=dfs(c,dp,i+1,(x*10+c[i]-'0')%13)%mod;
        }else{
            for(int j=0;j<=1;j++){
                ans=(ans+dfs(c,dp,i+1,(x*10+j)%13))%mod;
            }
        }
        dp[i][(int)x%13]=ans;
        return ans;
    }
}

动态规划:通过记忆化推出转移方程


public class Main {
    static int mod=(int)(1e9+7);
    public static void main(String[] args) {
        String str = Str();
        char[] c = str.toCharArray();  
        long[][] dp = new long[c.length + 1][13];  
        dp[0][0] = 1;  

        for (int i = 0; i < c.length; i++) {  
            for (int j = 0; j < 13; j++) {  
                if (dp[i][j] != 0) { 
                    if (c[i] != '?') {  
                        int digit = c[i] - '0';  
                        int newMod = (j * 10 + digit) % 13;  
                        dp[i + 1][newMod] = (dp[i + 1][newMod] + dp[i][j]) % mod;  
                    } else {  
                        for (int digit = 0; digit <= 1; digit++) {  
                            int newMod = (j * 10 + digit) % 13;  
                            dp[i + 1][newMod] = (dp[i + 1][newMod] + dp[i][j]) % mod;  
                        }  
                    }  
                }  
            }  
        }  
        long ans = dp[c.length][0];          
        pw.println(ans);
        pw.flush();
    }
}
全部评论

相关推荐

舂锋:不能投什么岗都用一份简历,一般都是要看企业的岗位需求来写职业技能或者是项目经历,跟岗位相关的就写多一点。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
现在才开始投还有可能吗😭😭😭
牛客621925249号:开秋招了已经
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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