P5664 [CSP-S2019] Emiya 家今天的饭
太难惹!!!
文章目录
- 题目描述
- 一、分析
- 二、代码
- 总结
题目描述
Emiya 是个擅长做菜的高中生,他共掌握 n 种烹饪方法,且会使用 m 种主要食材做菜。为了方便叙述,我们对烹饪方法从 1∼n 编号,对主要食材从 1∼m 编号。
Emiya 做的每道菜都将使用恰好一种烹饪方法与恰好一种主要食材。更具体地,Emiya 会做 道不同的使用烹饪方法 i 和主要食材 j 的菜(1≤i≤n,1≤j≤m),这也意味着 Emiya 总共会做道不同的菜。
Emiya 今天要准备一桌饭招待 Yazid 和 Rin 这对好朋友,然而三个人对菜的搭配有不同的要求,更具体地,对于一种包含 k 道菜的搭配方案而言:
- Emiya 不会让大家饿肚子,所以将做至少一道菜,即 k≥1
- Rin 希望品尝不同烹饪方法做出的菜,因此她要求每道菜的烹饪方法互不相同
- Yazid 不希望品尝太多同一食材做出的菜,因此他要求每种主要食材至多在一半的菜(即 道菜)中被使用
这里的 为下取整函数,表示不超过 x 的最大整数。
这些要求难不倒 Emiya,但他想知道共有多少种不同的符合要求的搭配方案。两种方案不同,当且仅当存在至少一道菜在一种方案中出现,而不在另一种方案中出现。
Emiya 找到了你,请你帮他计算,你只需要告诉他符合所有要求的搭配方案数对质数 998,244,353 取模的结果。
数据范围:
对于所有测试点,保证
一、分析
1.方法
由题目可知为求解方案数的问题转化为DP/组合数问题。分析题目中的数据 发现给我们提供了大量的状态直接选择DP。通过三个限制条件发现yazid的条件最难完成 所以从yazid 的条件入手,即维护每一列上的菜数不超过总数的一半。但是发现如果进行对于每一列的维护空间时间都不够。由正难则反易得,使用容斥原理,先计算出总体的所有方案数(乘法原理)再计算出每一列不符合的方案数进行差值的计算即可得出答案。
显然,在一个不成立的列方案中,必有一列的节点大于挑选的总结点,因此可以枚举这个超过限制的列,然后进行DP。
2.状态及状态转移方程
f[line][j][k]中 i表示已经在这一列枚举到第i行,j表示本列挑选了多少个菜,k表示其他列挑选了多少个菜,对于每个列复杂度为则总时间复杂度为显然已经超过了时间复杂度。
满分的话还需要进一步优化,对于j和k而言不需要知道具体的数值,由于条件为并且j+k=sum,则只要说明。时间复杂度变为
状态转移方程为f[line][c]=f[line-1][c]+f[line-1][c-1]*a[line][row]+f[line-1][c+1]*(sum[line]-a[line][row])//分别对应1.直接从上一行转移2.从上一行过来在本列选择一个3.从上一行过来在其他列选择。
3.注意事项
每次计算列的时候要memset,取模的时候注意不要出现负数,记得开long long!!!
十年OI一场空,不开longlong见祖宗!
二、代码
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define N 1000010
#define mod 998244353using namespace std;ll n,m,ans=1;
ll h[110][2010],cnt[10010],sum[210],f[210][5010];int main()
{scanf("%lld%lld",&n,&m);for(ll i=1;i<=n;++i){for(ll j=1;j<=m;++j){scanf("%lld",&h[i][j]); sum[i]=(sum[i]+h[i][j])%mod;//前缀和求出每行的总数}ans=(ans*(sum[i]+1))%mod;//计算总方案数}for(int row=1;row<=m;++row){memset(f,0,sizeof(0));f[0][n]=1;//重置 为n为了防止负数下标for(int line=1;line<=n;++line)for(int c=n-line;c<=n+line;++c)//j<k转移到j>k 但都是基于f[0][n]开始{f[line][c]=((f[line-1][c]+(f[line-1][c-1]*h[line][row])%mod)%mod+f[line-1][c+1]*(sum[line]-h[line][row])%mod)%mod; }for(int line=n+1;line<=2*n;++line)ans=(ans-f[n][line]+mod)%mod;//计算容斥//!!!!取模}printf("%lld\n",ans-1);return 0;
// 华丽结束
}
总结
本文仅仅简单介绍了DP的判断以及推出状态转移方程,但是其他神犇还有更加玄学的做法,详情请移步洛谷。
P5664 [CSP-S2019] Emiya 家今天的饭相关推荐
- [CSP day2T1]Emiya 家今天的饭
Emiya 家今天的饭 题解 挺容易的一道dp,我们可以先考虑容斥.先加上不考虑菜数不超过一半的值,再减去超过一半的部分. 表示在前i种中选j个菜的总种类,这个dp很好想, 下面就是最重要的了. 表示 ...
- NOIP2019 Emiya家今天的饭
NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法 ...
- 【CSP-S2019】D2T1 Emiya 家今天的饭
CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...
- 2019CSP-S Day2T1 Emiya 家今天的饭 题解
2019CSP-S Day2T1 Emiya 家今天的饭 题解 题目链接 我太菜了 64pts,m<=3m <= 3m<=3. 前64pts数据规模都差不多,因为mmm很小,考虑类似 ...
- Emiya家今天的饭
题目来源: Emiya家的饭 代码 #include <bits/stdc++.h> using namespace std; const int MOD = 998244353; con ...
- CSP-S2019学习笔记:Emiya家今天的饭
题目名称看样子灵感来自于日本动画片"卫宫家今天的饭". 这道题的难度是"提高+/省选-",算是提高组里比较难的.数据范围分的很细,解题方法跟数据范围关系比较大. ...
- 【CSP-S 2019】【洛谷P5664】Emiya 家今天的饭【dp】
题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述, ...
- 洛谷P5664 Emiya 家今天的饭
题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim m1∼ ...
- Emiya 家今天的饭(CSP 2019 D2 T1)
题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim ...
最新文章
- ICLR 2022论文列表公布,接收率高达32%
- 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)
- /bin/sh^M:损坏的解释器: No such file or directory
- bzoj4525[Usaco2016 Jan]Angry Cows
- 数值比较器实现_电动开窗器、手动开窗器使用介绍
- 转:11个实用但你可能不知道的Python程序库
- 从未后悔认识你,只是不知如何面对分开的结局
- JavaBean fields TO ExtjsMode fields
- 认识定制:JSON绑定概述系列
- 微信朋友圈删除后服务器还有吗,删了的朋友圈还可以找回来吗
- 2018-06-13 pymssql 访问 SQL Server 2017 或 pyodbc 访问支持 ODBC 的数据库
- 适配器自动分配的169开头的地址_代理ip地址怎么换
- 怎么创建css样式表,为HTML5表单创建CSS样式
- 常见的图标库有哪些?
- 仲裁器设计(4)Weighted Round Robin
- AQI空气质量分析与预测
- python和stata哪个数据分析实例,STATA数据分析案例:Zoutendijk可行方向法
- Mybatis注解-注解方式的动态SQL语句
- 【Java】对象的实例化
- 切片、切块、钻取和旋转