京东笔试
三道编程题
小红有一个数组,她需要对效组操作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++/嵌入式笔试汇总,持续更新

