P7961 [NOIP2021] 数列 (DP 刷表法)
(n<=30,是个多维的DP)
v数组就是用来计算权值的,一共有m+1个。将S看做一个二进制数,按照题目S的定义,相当于在S的每一位可以随便+1(满足限制情况下),一共可以加n次。
我们来建立DP的维度,首先第一个i表示对二进制数处理到i位(从低位到高位),j表示使用了几个数(一共n个数可使用),为了满足题目要求,我们还要设置一个k表示此时的二进制一共有多少个1(题目要求不超过K),可能还会有进位的情况,再加一个p表示要向下一位进位的个数。
于是就有f[i][j][k][p](表示这四维状态下的权值和),如果用填表法不好处理,那就用刷表法向后转移:
已经选了j个数,还剩下n-j个数,我们从剩下数中选择t个加入到i+1位,再处理一下进位的情况,就有f[i+1][j+t][k+(t+p)mod2][(t+p)>>1]+=f[i][j][k][p]*pv[i][t]*C[n-j][t]。pv和C在代码中均有解释。
处理完后最高位可能还有进位的情况,再简单的处理一下就行了。
1 #include<bits/stdc++.h>
2 #define mod 998244353
3 #define ll long long
4 using namespace std;
5 ll ans, f[105][35][35][16], C[35][35], v[105], pv[105][35];
6
7 void init(int n) {//预处理组合数
8 for (int i = 0; i <= n; i++) C[i][0] = 1;
9 for (int i = 1; i <= n; i++)
10 for (int j = 1; j <= i; j++)
11 C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
12 }
13
14 int popcnt(int n) {//统计二进制下1的个数
15 int res = 0;
16 while (n) res += n & 1, n >>= 1;
17 return res;
18 }
19
20 int main() {
21 init(30);
22 int n, m, K;
23 scanf("%d %d %d", &n, &m, &K);
24 for (int i = 0; i <= m; i++) {
25 scanf("%lld", &v[i]);
26 pv[i][0] = 1;
27 for (int j = 1; j <= n; j++) pv[i][j] = pv[i][j - 1] * v[i] % mod;//i^j
28 }
29 f[0][0][0][0] = 1;
30 for (int i = 0; i <= m; i++)
31 for (int j = 0; j <= n; j++)
32 for (int k = 0; k <= K; k++)
33 for (int p = 0; p <= n >> 1; p++)
34 for (int t = 0; t <= n - j; t++) {
35 f[i + 1][j + t][k + (t + p & 1)][(t + p) >> 1] = (f[i + 1][j + t][k + (t + p & 1)][(t + p) >> 1] + f[i][j][k][p] * pv[i][t] % mod * C[n - j][t] % mod) % mod;
36 }
37 for (int k = 0; k <= K; k++)
38 for (int p = 0; p <= n >> 1; p++)
39 if (k + popcnt(p) <= K)
40 ans = (ans + f[m + 1][n][k][p]) % mod;
41 printf("%lld\n", ans);
42 return 0;
43 }
P7961 [NOIP2021] 数列 (DP 刷表法)的更多相关文章
- dp填表法,刷表法
填表法:利用上一状态推当前 刷表法:利用当前推关联,利用刷表法较为便捷,向上边界较容易处理,处理在本次循环中的影响
- 刷表法动态规划:HOJ11391_Word Clouds Revisited
题目大意,给若干方块,让把方块拍成若干行,使得最终高度最小.其中,每行有宽度限制,高度为每行中最高的箱子的高度. 于是,很直观的认为,这个题可能也许大概应该是个动态规划的题. 于是,设DP[K]为K及 ...
- dp的刷表法和填表法
dp的刷表法和填表法 参考: 动态规划刷表法 - acmer_xue的博客 - CSDN博客http://blog.csdn.net/qq_30241305/article/details/52198 ...
- DP刷题记录(持续更新)
DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...
- YUV420查表法高效、无失真的转换为RGB32格式
YUV格式有两大类:planar和packed.planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,这里所讲述的就是这中存储格式的:packed的YUV ...
- C#,Java,C -循环冗余检验:CRC-16-CCITT查表法
C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...
- C语言:十进制进制转换为其他进制(思想:查表法)
// // main.c // Hex conversion // // Created by ma c on 15/7/22. // Copyright (c) 2015年 bjsxt. A ...
- 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法
快速查找素数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...
- 查表法计算CRC16校验值
CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...
随机推荐
- 2022-07-10 第五小组 pan小堂 css学习笔记
css学习笔记 什么是 CSS? CSS 指的是层叠样式表* (Cascading Style Sheets) CSS 描述了如何在屏幕.纸张或其他媒体上显示 HTML 元素 CSS 节省了大量工作. ...
- 常用的函数式接口_Consumer接口和常用的函数式接口_Consumer接口的默认方法andThen
Consumer接口 java,util.function.Consumer接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定 抽象方法:accept C ...
- 记vs2019 The view 'xxx' was not found.
版本:Visual Studio 2019 16.8.2/16.8.4.net core 3.1 1.检测是否是拼写错误2.检查.csproj为文件中是否包含有下面的content remove(这种 ...
- centos安装torch==1.4.0与相关细节
对于某些直接安装torch==1.4.0报错的情况(没错,就是我遇到了) 在网上查找了,大概的解决方法是先安装一个低版本的torch和torchvision, torchvision是pytorch中 ...
- Javascript 正则使用笔记
# 一.如何创建正则表达式对象 # 1.通过RegExp构造函数来创建.i代表忽略大小写,g代表全局搜索(非全局搜索正则只匹配第一次符合的内容,全局搜索可以匹配多次). var reg = new R ...
- 最新豆瓣top250爬虫案例代码分析[注释齐全]
导入包 # json包 import json #正则表达式包 import re import requests from requests import RequestException 定义爬取 ...
- JVM 配置参数 -D,-X,-XX 的区别
转载请注明出处: 最近在安全护网行动,需要针对服务进行不断的安全加固,如 对服务的 log4j 的安全配置进行防护,对 fastjson 的漏洞进行安全加固等,最快的防护方法就是通过在服务启动的时候, ...
- Excelize 发布 2.6.0 版本,功能强大的 Excel 文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...
- suse 11 sp3编译报错问题
suse安装,默认是不安装gcc的,今天安装gcc之后,编译suse11 sp3,报错如下: scripts/basic/fixdep.c:106:23: fatal error: sys/types ...
- 【Homebrew】安装
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 官网安 ...