(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 刷表法)的更多相关文章

  1. dp填表法,刷表法

    填表法:利用上一状态推当前 刷表法:利用当前推关联,利用刷表法较为便捷,向上边界较容易处理,处理在本次循环中的影响

  2. 刷表法动态规划:HOJ11391_Word Clouds Revisited

    题目大意,给若干方块,让把方块拍成若干行,使得最终高度最小.其中,每行有宽度限制,高度为每行中最高的箱子的高度. 于是,很直观的认为,这个题可能也许大概应该是个动态规划的题. 于是,设DP[K]为K及 ...

  3. dp的刷表法和填表法

    dp的刷表法和填表法 参考: 动态规划刷表法 - acmer_xue的博客 - CSDN博客http://blog.csdn.net/qq_30241305/article/details/52198 ...

  4. DP刷题记录(持续更新)

    DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...

  5. YUV420查表法高效、无失真的转换为RGB32格式

    YUV格式有两大类:planar和packed.planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V,这里所讲述的就是这中存储格式的:packed的YUV ...

  6. C#,Java,C -循环冗余检验:CRC-16-CCITT查表法

    C#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ...

  7. C语言:十进制进制转换为其他进制(思想:查表法)

    // //  main.c //  Hex conversion // //  Created by ma c on 15/7/22. //  Copyright (c) 2015年 bjsxt. A ...

  8. 【NYOJ-187】快速查找素数—— 枚举法、筛选法、打表法

    快速查找素数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在给你一个正整数N,要你快速的找出在2.....N这些数里面所有的素数. 输入 给出一个正整数数N(N ...

  9. 查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

随机推荐

  1. 洛谷 P5627 题解

    题意 Link 求 \[\sum_{i=1}^{2^n}\log_2\left(\prod_{j=1}^i\operatorname{lowbit}(j)\right) \] \(n\le 2^{64 ...

  2. 利用CSS3自定义属性来为网站添加“暗黑模式”(暗色模式/DarkMode)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_114 究竟什么是暗黑模式?这个概念起初来源于macOS系统,该系统的mojave版本为用户提供两个主题皮肤,即浅色和深色的皮肤.自 ...

  3. 针对多个球体的World类

    World类其他都一样的,就修改build函数就行了,以后测试所有代码,都是基于两个或多个球体的,不再重复阐述. void World::build() { vp.set_hres(200); vp. ...

  4. Jenkins初始化界面一直显示Please wait while Jenkins is getting ready to work ...

    第一次访问jenkins时,会提示如下界面:  注:如果这个界面初始化的时间过长,则需要修改相关配置文件. 原因:因为访问官网太慢.我们只需要换一个源,不使用官网的源即可. 1.找到 jenkins工 ...

  5. 744. 寻找比目标字母大的最小字母--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/find-smallest-letter-greater-than-target 著作权归领扣网络所有. ...

  6. Flutter 实战(一):列表项内容可自定义的列表组件

    前言 本篇文的目的是熟练掌握 Flutter 组件的封装,并且使用回调函数实现主要功能. 本组件的设计灵感来源于 Element 组件库的 table 组件. 正题 定义回调函数 在此之前,必须要了解 ...

  7. React报错之React Hook useEffect has a missing dependency

    正文从这开始~ 总览 当useEffect钩子使用了一个我们没有包含在其依赖数组中的变量或函数时,会产生"React Hook useEffect has a missing depende ...

  8. linux scsi相关的一些学习笔记

      最近看scsi相关处理的一些备忘,比较零碎,仅作参考. 先从最显而易见的打印入手: [0:0:0:0] disk ATA INTEL SSDSC2BX20 0150 - [0:0:1:0] dis ...

  9. 一次客户需求引发的K8S网络探究

    前言 在本次案例中,我们的中台技术工程师遇到了来自客户提出的打破k8s产品功能限制的特殊需求,面对这个极具挑战的任务,攻城狮最终是否克服了重重困难,帮助客户完美实现了需求?且看本期K8S技术案例分享! ...

  10. 【Java】学习路径48-线程锁ReentrantLock

    与上一章学习的线程锁synchronized类似,都是为了解决线程安全的问题. 使用方法: 新建一个ReentrantLock对象.(如果使用Thread多线程,则需要声明static静态) 然后在需 ...