(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. CentOS 定时计划任务设置

    一.安装crontab服务并设置开机自启 yum install crontabs (centos默认就会带,一般不需要安装) systemctl enable crond (设为开机启动) syst ...

  2. Linux Shell 自动交互功能

    需求背景:   近日,在安装某软件过程,发现在安装过程需要输入一些信息才能继续下一步操作,在机器数量较少情况下,我们可以单台登录上去完成安装操作,但当机器数量超过一定时,如果再手动登录操作,就会产生大 ...

  3. 解决linux下U盘变成只读模式

    在最近的一个项目里,需要将linux下的些文件拷贝出来.插入U盘后,发现是只读模式. U盘可以写出,不能写入. 折腾了一翻: 最后这样解决的: 将U盘插入到windows下 执行 chkdsk g: ...

  4. .Net Core使用Coravel实现任务调度

    前言 前段时间需要在一个新项目里添加两个后台任务,去定时请求两个供应商的API来同步数据:由于项目本身只是一个很小的服务,不太希望引入太重的框架,同时也没持久化要求:于是我开始寻找在Quartz.Ne ...

  5. 第三十二篇:vue的响应式原理

    好家伙 什么是响应式?比较官方的回答: Vue.js 的核心包括一套"响应式系统". "响应式",是指当数据改变后,Vue 会通知到使用该数据的代码. 例如,视 ...

  6. Docker网络讲解 及实验redis集群部署

    理解docker0 准备工作:清空所有的容器,清空所有的镜像 docker rm -f $(docker ps -a -q) # 删除所有容器 docker rmi -f $(docker image ...

  7. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障

    案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...

  8. 全网最简单的大文件上传与下载代码实现(React+Go)

    前言 前段时间我需要实现大文件上传的需求,在网上查找了很多资料,并且也发现已经有很多优秀的博客讲了大文件上传下载这个功能. 我的项目是个比较简单的项目,并没有采用特别复杂的实现方式,所以我这篇文章的目 ...

  9. C#/VB.NET 在Word文档中插入分页符

    分页符是分页的一种符号,上一页结束以及下一页开始的位置.通查用于在指定位置强制分页.本文将分为两部分来介绍如何在Word文档中插入分页符.并附上C#/VB.NET以供参考,详情请阅读以下内容. 在特定 ...

  10. 【一月一本技术书】-【Go语言设计与实现】- 9月

    Go : 2009.11.10 代表作:Docker.k8s.etcd 模仿C语言,目标:互联网的C语言 讲的晦涩难懂....硬板..放弃了好几次才读完.满分10分,打6分. 下个月:Python数据 ...