招引信用卡中心第三题憋破脑袋想出来的答案

招引信用卡中心,第三题,笔试没做,现在想出来的代码,不知道对不对
修改:之前的代码有问题,索引和权值不对
import java.util.ArrayList;
import java.util.Scanner;

public class Test1 {
    private static int mod = (int)1e9 + 7;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int n = str.length();
        ArrayList<Integer> arrayList = new ArrayList<>();
        int con = 0, remain = 1;
        for (int i = 0; i < n; i++) {
                        int reverse = n - i - 1;
            if(str.charAt(reverse) == '?') {
                arrayList.add(remain);
            }else {
                con += (str.charAt(reverse) - '0') * remain; con %= 13;
            }
            remain = remain * 10 % 13;
        }
        int m = arrayList.size();
        int[][] dp = new int[m + 1][13];
        dp[0][con] = 1;
        for (int i = 1; i <= m; i++) {
            for (int j = 0; j < 10; j++) {
                for (int k = 0; k < 13; k++) {
                    int idx = (k + j * arrayList.get(i - 1)) % 13;
                    dp[i][idx] += dp[i - 1][k];
                    dp[i][idx] %= mod;
                }
            }
        }
        System.out.println(dp[m][5]);
    }
}        

#笔试题目##招银网络##Java##秋招##笔经#
全部评论
大佬熬夜想代码
点赞 回复
分享
发布于 2019-09-16 00:58
直接在原串上dp就行了,遇到数字直接13个决策转移,遇到问号就13*10个决策转移。你k转移到idx不该是k*10 j模13就行了吗,看不太懂你的
点赞 回复
分享
发布于 2019-09-16 01:19
阅文集团
校招火热招聘中
官网直投
dp[0][0]=1; for(i=1;i<=n;i++){     if(str[i]=='?'){         for(j=0;j<13;j++){             for(k=0;k<10;k++){                 int v=(j*10+k)%13;                 dp[i][v]+=dp[i-1][j];                 dp[i][v]%=MOD;             }         }     }else {         int d=str[i]-'0';         for(j=0;j<13;j++){             int v=(j*10+d)%13;             dp[i][v]+=dp[i-1][j];             dp[i][v]%=MOD;         }     } } printf("%d\n",dp[n][5]);
点赞 回复
分享
发布于 2019-09-16 11:12

相关推荐

4 9 评论
分享
牛客网
牛客企业服务