三道编程题小红有一个数组,她需要对效组操作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;}
点赞 4
评论 2
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-29 12:06
点赞 评论 收藏
分享
牛客34884196...:你期望薪资4-5k,那确实可以重生了,但很难在深圳活下去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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