【题解】[Codechef] Beautiful Permutation

news/2024/10/18 17:03:06/文章来源:https://www.cnblogs.com/Daniel-yao/p/18474614

传送门

以此纪念我场切的 dp。

这种计数的类型一看就很 dp 的样子。考场上一开始设的 dp 状态是 \(dp_{i,j,k_1,k_2,0/1}\) 表示将前 \(i\)个数分为 \(j\) 段,放了 \(k_1\) 个偶数,\(k_2\) 个奇数,当前段为偶数段或奇数段的方案数。考虑如何转移,记 \(cnt_0\) 表示序列中可填入的偶数个数,\(cnt_1\) 表示序列中可填入的奇数个数。

\(i\) 为空时,可以写出四个转移:

\[dp_{i,j,k_1,k_2,0} = (cnt_0-k_1+1)(dp_{i-1,j,k_1-1,k_2,0} + dp_{i-1,j-1,k_1-1,k_2,1}) \]

\[dp_{i,j,k_1,k_2,1}=(cnt_1-k_2+1)(dp_{i-1,j,k_1,k_2-1,1} + dp_{i-1,j-1,k_1,k_2-1,0}) \]

\(i\) 为非空时,可以根据 \(a_i\) 的奇偶性写出两个转移:

\[dp_{i,j,k_1,k_2,0} = dp_{i-1,j,k_1,k_2,1} + dp_{i-1,j-1,k_1,k_2,0} (a_i 为奇数) \]

\[dp_{i,j,k_1,k_2,1} = dp_{i-1,j-1,k_1,k_2,1} + dp_{i-1,j,k_1,k_2,0} (a_i 为偶数) \]

可以把第一维滚掉,这样就做到了时间复杂度 \(O(n^4)\),空间复杂度 \(O(4n^3)\)。70分到手。

我们发现记前 \(i\) 个数中空位为 \(sum_i\) 个,则填了 \(k_2\) 个奇数时必然填了 \(sum_i-k_2\) 个偶数。偶数的数量可以被奇数固定下来,于是重新设状态 \(dp_{i,j,k_2,0/1}\) 表示将前 \(i\)个数分为 \(j\) 段,\(k_2\) 个奇数,当前段为偶数段或奇数段的方案数。则转移变为:

\(i\) 为空时:

\[dp_{i,j,k_2,0} = (cnt_0-(sum_i-k_2)+1)(dp_{i-1,j,k_2,0} + dp_{i-1,j-1,k_2,1}) \]

\[dp_{i,j,k_2,1}=(cnt_1-k_2+1)(dp_{i-1,j,k_2-1,1} + dp_{i-1,j-1,k_2-1,0}) \]

\(i\) 为非空时:

\[dp_{i,j,k_2,0} = dp_{i-1,j,k_2,1} + dp_{i-1,j-1,k_2,0} (a_i 为奇数) \]

\[dp_{i,j,k_2,1} = dp_{i-1,j-1,k_2,1} + dp_{i-1,j,k_2,0} (a_i 为偶数) \]

时间复杂度为 \(O(n^3)\),空间复杂度 \(O(2n^3)\)。可通过此题。

#include<bits/stdc++.h>
#define int long long
#define For(i,l,r) for(int i=l;i<=r;++i)
#define FOR(i,r,l) for(int i=r;i>=l;--i)
#define mod 1000000007using namespace std;const int N = 305;int n, m, a[N], cnt[N], dp[N][N][N][2], sum;signed main() {freopen("2475.in", "r", stdin);freopen("2475.out", "w", stdout);ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;For(i,1,n) {cin >> a[i];if(!a[i]) continue;cnt[a[i] & 1]++;}cnt[0] = n / 2 - cnt[0];cnt[1] = ceil(1.0 * n / 2) - cnt[1];dp[0][0][0][0] = dp[0][0][0][1] = 1;For(i,1,n) {if(!a[i]) sum++;For(j,1,m) {For(k2,0,min(sum, cnt[1])) {if(a[i] != 0) {if(a[i] & 1) {dp[i][j][k2][1] = (dp[i][j][k2][1] + (dp[i-1][j-1][k2][0] + dp[i-1][j][k2][1]) % mod) % mod;} else {dp[i][j][k2][0] = (dp[i][j][k2][0] + (dp[i-1][j][k2][0] + dp[i-1][j-1][k2][1]) % mod) % mod;}continue;}if(cnt[0] - (sum - k2) + 1 > 0) dp[i][j][k2][0] = (dp[i][j][k2][0] + ((cnt[0] - (sum - k2) + 1) * (dp[i-1][j-1][k2][1] + dp[i-1][j][k2][0]) % mod) % mod) % mod;if(k2 != 0) dp[i][j][k2][1] = (dp[i][j][k2][1] + ((cnt[1] - k2 + 1) * (dp[i-1][j-1][k2-1][0] + dp[i-1][j][k2-1][1]) % mod) % mod) % mod;}}}cout << (dp[n][m][cnt[1]][0] + dp[n][m][cnt[1]][1]) % mod << '\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/816953.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普天同悲

谨记,谨记。世人若学我,当如堕魔道。

Denoising Diffusion Implicit Models(去噪隐式模型)

DDPM有一个很麻烦的问题,就是需要迭代很多步,十分耗时。有人提出了一些方法,比如one-step dm等等。较著名、也比较早的是DDIM。 原文:https://arxiv.org/pdf/2010.02502 参考博文:https://zhuanlan.zhihu.com/p/666552214?utm_id=0 DDIM假设 DM假设 ddim给出了一个新的扩…

20222408 2024-2025-1 《网络与系统攻防技术》实验二实验报告

1.实验内容 1.1本周学习内容 本次实验中,学习的重点是后门的实现与启动方式,学习内容还有后门的定义、原理以及可能影响,netcat、socat、MSF meterpreter软件的应用。 1.2实验内容简述使用netcat获取主机操作Shell,利用cron启动一项任务 使用socat获取主机操作Shell, 利用创…

京东APP百亿级商品与车关系数据检索实践

作者:京东零售 张强导读 本文主要讲解了京东百亿级商品车型适配数据存储结构设计以及怎样实现适配接口的高性能查询。通过京东百亿级数据缓存架构设计实践案例,简单剖析了jimdb的位图(bitmap)函数和lua脚本应用在高性能场景。希望通过本文,读者可以对缓存的内部结构知识有一…

专题(二十) cut

一、作用与介绍cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符、字段写至标准输出。 二、用法选项 用法说明 举例说明 备注-b 按字节截取 who | cut -b 3 输出每行的第三个字节-c 按字符截取,常用于中文 cut -c 2 输出每行的第二个中文字符-d 指定以什么为…

【DevExpress】(多行粘贴、块粘贴)

复制是GridControl自带的属性,主要解决的是多个单元格复制的问题,这里涉及到两个参数。 主要是粘贴的 先定义两个全局变量,在单元格点击事件的时候获取单元格的行号和列号1 //获取当前选中单元格所在的列序号2 int curntindex;3 //获取获取当前选中单元格所在的行…

Jenkins+Coverage的代码覆盖率集成实践

Jenkins+Coverage的代码覆盖率集成实践 一、工具介绍Jenkins: Jenkins是一个开源的、基于Java开发的持续集成工具,它可以帮助开发人员自动化构建、测试和部署软件项目。 Coverage: Coverage是一个Python代码覆盖率工具,用于测量代码执行过程中哪些代码行被执行到,从而评估…

C++顺序结构(3)、数据类型_____教学

一、设置域宽setw() 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽。 使用setw()前,必须包含头文件iomanip,即#include<iomanip> 头文件iomanip,用来声明一些“流操作符”,需要一定格式输入输出时,就需要用到它,比较常用的有设置域宽、设置左右对齐、设置…

OpenCity: Open Spatio-Temporal Foundation Models for Traffic Prediction

1. 数据准备 在这个数据处理过程中,以数据集 PEMS07M 为例,整个数据抽取和划分过程如下:初始数据维度:原始训练数据 data_train 的维度为 (12672, 228, 3)。其中:12672 表示时间步数,代表不同的时间点采样的数据。 228 表示空间节点数(例如不同的交通站点)。 3 表示每个…

04C++顺序结构(3)

1、设置域宽setw(); 2、cin语句; 3、输入输出.格式化一、设置域宽setw() 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽。 使用setw()前,必须包含头文件iomanip,即#include<iomanip> 头文件iomanip,用来声明一些“流操作符”,需要一定格式输入输出时,就…

轻松上手-MVVM模式_关系型数据库_云函数T云数据库

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…

九宫格自由流转拼图游戏

作者:狼哥 团队:坚果派 团队介绍:坚果派由坚果等人创建,团队拥有12个华为HDE带领热爱HarmonyOS/OpenHarmony的开发者,以及若干其他领域的三十余位万粉博主运营。专注于分享HarmonyOS/OpenHarmony、ArkUI-X、元服务、仓颉。团队成员聚集在北京,上海,南京,深圳,广州,宁…