【每日一题】ABC248C - Dice Sum | 动态规划 |简单

这篇具有很好参考价值的文章主要介绍了【每日一题】ABC248C - Dice Sum | 动态规划 |简单。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目内容

原题链接

构造一个长度为 n n n 的整数数组 a a a ,满足如下两个条件:

  • 1 ≤ a i ≤ m 1\leq a_i\leq m 1aim
  • ∑ a i ≤ k \sum a_i\leq k aik

问可以构造出多少种不同的数组 a a a

数据范围

  • 1 ≤ n , m ≤ 50 1\leq n,m\leq 50 1n,m50
  • n ≤ k ≤ n × m n\leq k\leq n\times m nkn×m

题解

经典的动态规划。

状态定义

d p [ i ] [ j ] dp[i][j] dp[i][j] 表示数组 a a a 的前 i i i 个数,和为 j j j 的方案数。

状态转移

d p [ i ] [ j ] = ∑ d p [ i − 1 ] [ k ] , ( 1 ≤ j − k ≤ m ) dp[i][j]=\sum\limits dp[i-1][k],(1\leq j-k\leq m) dp[i][j]=dp[i1][k],(1jkm)

状态转移只用到了第 i − 1 i-1 i1 的状态,故可以用两个数组滚动即可。

时间复杂度: O ( n m k ) O(nmk) O(nmk)文章来源地址https://www.toymoban.com/news/detail-706242.html

代码

#include <bits/stdc++.h>
using namespace std;

const int MOD = 998244353;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, k;
    cin >> n >> m >> k;

    // dp[i][j] 表示前 i 个数,和为 j 的方案数
    // dp[i][j] = dp[i - 1][k], k < j

    vector<int> dp(k + 1);
    vector<int> ndp(k + 1);

    dp[0] = 1;
    for (int i = 1; i <= n; ++i) {
        for (int j = i; j <= min(k, i * m); ++j) {
            ndp[j] = 0;
            // 最低是 i-1, 但是当前最多为 m ,所以 j-m
            for (int ch = 1; ch <= m && j - ch >= i - 1; ++ch) {
                ndp[j] += dp[j - ch];
                if (ndp[j] >= MOD) ndp[j] -= MOD;
            }
        }
        swap(dp, ndp);
    }

    int ans = 0;
    for (int j = n; j <= min(n * m, k); ++j) {
        ans += dp[j];
        if (ans >= MOD) ans -= MOD;
    }

    cout << ans << "\n";

    return 0;
}

到了这里,关于【每日一题】ABC248C - Dice Sum | 动态规划 |简单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Week 19]每日一题(C++,数学,并查集,动态规划)

    目录 [Daimayuan] T1 倒数第n个字符串(C++,进制) 输入格式 输出格式 样例输入 样例输出 解题思路 [Daimayuan] T2 排队(C++,并查集) 输入格式 输出格式 样例输入1 样例输出1 样例输入2 样例输出2 样例输入3 样例输出3 数据规模 解题思路 [Daimayuan] T3 素数之欢(C++,BFS) 数据规模

    2024年02月02日
    浏览(52)
  • 【每日一题 | 动态规划】访问完所有房间的第一天

    【动态规划】【数组】【2024-03-28】 1997. 访问完所有房间的第一天 定义状态 定义 f[i] 表示第一次到达房间 i 的日期编号。 根据题意,首次(第 1 次)访问房间 i 时,因为 1 是计数,所以下一次一定会访问房间 j = nextVisit[i] 。只有访问次数达到偶数才能访问右边的下一个房间

    2024年04月16日
    浏览(38)
  • [Week 18] 每日一题(C++,动态规划,线段树,数学)

    目录 [Daimayuan] T1 最长公共子序列(C++,DP,二分) 输入格式 输出格式 数据范围 输入样例 输出样例 解题思路 [Daimayuan] T2 喵喵序列(C++,序偶) 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 数据范围 双倍经验 解题思路: [Daimayuan] T3 漂亮数(C++,字符串) 输入

    2023年04月24日
    浏览(59)
  • 罗勇军 →《算法竞赛·快冲300题》每日一题:“乘积” ← 动态规划

    【题目来源】 http://oj.ecustacm.cn/problem.php?id=1781 http://oj.ecustacm.cn/viewnews.php?id=1023 【题目描述】 给你一个长度为 n 的序列,序列中的元素只包括 1 和 -1。 请问有多少个连续的子序列乘积为正数。 【输入格式】 输入第一行为正整数 n。(n不超过10^6) 第二行包含 n 个整数。 【输

    2024年02月11日
    浏览(52)
  • (动态规划) 剑指 Offer 42. 连续子数组的最大和 ——【Leetcode每日一题】

    难度:简单 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 要求时间复杂度为 O(n) 。 示例1: 输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示 : 1 = a r r . l e n g t h = 1 0 5 1 = arr.length = 10^

    2024年02月11日
    浏览(53)
  • (动态规划) 剑指 Offer 60. n个骰子的点数 ——【Leetcode每日一题】

    难度:中等 把 n 个骰子扔在地上,所有骰子朝上一面的点数之和为 s 。输入 n ,打印出s的所有可能的值出现的概率。 你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。 示例 1: 输入: 1 输出: [0.16667,0.16667,0.16667,

    2024年02月11日
    浏览(45)
  • ( 动态规划) 674. 最长连续递增序列 / 718. 最长重复子数组——【Leetcode每日一题】

    难度:简单 给定一个未经排序的整数数组,找到最长且 连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列 可以由两个下标 l 和 r(l r) 确定,如果对于每个 l = i r ,都有 nums[i] nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

    2024年02月05日
    浏览(52)
  • 【每日一题Day208】LC1335工作计划的最低难度 | 动态规划

    工作计划的最低难度【LC1335】 你需要制定一份 d 天的工作计划表。工作之间存在依赖,要想执行第 i 项工作,你必须完成全部 j 项工作( 0 = j i )。 你每天 至少 需要完成一项任务。工作计划的总难度是这 d 天每一天的难度之和,而一天的工作难度是当天应该完成工作的最大

    2024年02月05日
    浏览(70)
  • (动态规划) 剑指 Offer 10- I. 斐波那契数列 ——【Leetcode每日一题】

    难度:简单 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N) )。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计

    2024年02月12日
    浏览(56)
  • (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

    难度:中等 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所

    2024年02月11日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包