当前位置: 首页 > news >正文

dp + 计数,1954D - Colored Balls

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

Problem - 1954D - Codeforces


二、解题报告

1、思路分析

本题前置题目:

1953. 你可以工作的最大周数

通过前置题目可以知道如何计算两两不同数对序列的最大长度

我们记最大数量为ma,总数目为N

如果ma > N / 2, 那么划分的组数取决于ma,即ma组

如果ma <= N / 2, 那么划分组数为floor(N / 2)

换句话说,任意(N, ma)我们可以计算出其组数

那么(N, ma)状态有多少种?每种(n,ma)有多少个?

n个颜色最多对应n个ma,也就是说我们最多有N * n种状态

而N 和 n的上界都是5000

我们如果定义状态f[总数][最大值],那么每次状态转移需要遍历比当前最大值小的状态,这样的时间复杂度为O(n^3)

但是我们发现我们将原数组排序,那么我们顺序遍历的时候,最大值就是当前值

我们考虑设计状态f[i][x]为遍历到第i个物品时,容量为x的方案数

那么f[i][x] = Σf[i -1][j - nums[i]]

而我们得知方案数后自然可以根据容量和当前最大值nums[i]来计算其贡献

然后我们用f[i][x]更新f[i + 1][x + nums[i]]即可

我们发现这似乎退化成了01背包问题,而且可以滚动数组优化

然后问题就迎刃而解了

2、复杂度

时间复杂度: O(n^2)空间复杂度:O(n)

3、代码详解

# import sys# sys.stdin = open('in.txt','r')
mod = 998244353n = int(input())
a = list(map(int, input().split()))a.sort()f = [0] * 5001
f[0] = 1res = s = 0
for x in a:for i in range(s, -1, -1):if f[i]:res = (res + f[i] * max((i + x + 1) // 2, x)) % modf[i + x] = (f[i] + f[i + x ]) % mods += xprint(res)

http://www.lryc.cn/news/355341.html

相关文章:

  • 【设计模式深度剖析】【5】【结构型】【桥接模式】| 以电视和遥控器为例加深理解
  • 一键安装脚本sh
  • WebGL在医学成像方面的应用
  • SpringBoot+layuimini实现角色权限菜单增删改查(layui扩展组件 dtree)
  • 项目范围管理
  • 监管端..
  • 点击登录按钮先检测输入框的规则检测(vue组合式)
  • 网络工程师---第四十二天
  • leetcode 1241每个帖子的评论数(postgresql)
  • 前端最新面试题(ES6模块篇)
  • STM32H750外设之ADC通道选择
  • 【Unity2D 2022:Cinemachine】相机跟随与地图边界
  • ssh远程连接的相关配置
  • 在leafet上画圆、多边形、线、矩形
  • SpringBoot中如何在服务器进行校验?
  • element ui 的el-input输入一个字后失去焦点,需重新点击输入框才能再次输入
  • 【绝地求生game】
  • Mac上Steam安装的游戏已经卸载,但游戏的快捷方式图标仍存在的解决方式
  • PTA 判断两个矩阵相等
  • 《征服数据结构》双向链表
  • 我用 Midjourney 的这种风格治愈了强迫症
  • 三维大场景管理-3Dtiles规范
  • Flutter 中的 FractionalTranslation 小部件:全面指南
  • Thrift快速入门开发demo
  • 关于C++智能指针复习总结
  • Prometheus Operator创建告警规则并接入钉钉报警
  • Word整理论文参考文献
  • 计算机网路概述
  • 832. 翻转图像 - 力扣
  • mumu 模拟器安装