京东笔试

三道编程题

小红有一个数组,她需要对效组操作n-1次,每次操作有两种选择: 1:选择数组的最后两个数,记x,y,将它们从数组中删除,然后将x+y的个位数放到数组最后 2:选择数组的最后两个数,记x,y,将它们从数组中删除,然后将x*y的个位数放到数组最后 操作n-1步之后就剩一个数字,从0到9都有可能, 输出0-9可能的方案数

思路:动态规划,设计二维dp[i][j]表示第i次操作后,个位数为j的方案数,i从1到n,j取值0-9

理解题意相当于每次操作0-9的方案总数会*2

根据两种操作,动态规划递推式为

int op1 = (j + nums[n-i-1]) % 10;

int op2 = (j * nums[n-i-1]) % 10;

dp[i][op1] += dp[i-1][j] ;

dp[i][op2] += dp[i-1][j] ;

完整代码如下:

#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1e9 + 7;

void solve(std::vector<int>& nums) {
    int n = nums.size();
    std::vector<std::vector<int>> dp(n, std::vector<int>(10, 0));

    for (int i = 0; i < 10; ++i) {
        dp[0][i] = (i == nums[n-1]) ? 1 : 0;
    }
    for (int i = 1; i < n; ++i) {
        for (int j = 0; j < 10; ++j) {
                int op1 = (j + nums[n-i-1]) % 10;
                int op2 = (j * nums[n-i-1]) % 10;
                dp[i][op1] += dp[i-1][j] % MOD;
                dp[i][op2] += dp[i-1][j] % MOD;
        }
    }
    for (int i = 0; i < 10; ++i) {
        std::cout<<dp[n-1][i]<<" ";
    }
}

int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; ++i) {
        std::cin >> nums[i];
    }
    solve(nums);
    return 0;
}

#京东信息集散地#
2023C++/嵌入式笔试汇总 文章被收录于专栏

2023C++/嵌入式笔试汇总,持续更新

全部评论
6 mark 我都没做出来这道题
点赞
送花
回复
分享
发布于 2023-08-15 15:26 北京
楼主投的什么岗位哦?
点赞
送花
回复
分享
发布于 2023-08-15 16:22 河南
滴滴
校招火热招聘中
官网直投

相关推荐

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