太难惹!!!

文章目录

  • 题目描述
  • 一、分析
  • 二、代码
  • 总结

题目描述

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 家今天的饭相关推荐

  1. [CSP day2T1]Emiya 家今天的饭

    Emiya 家今天的饭 题解 挺容易的一道dp,我们可以先考虑容斥.先加上不考虑菜数不超过一半的值,再减去超过一半的部分. 表示在前i种中选j个菜的总种类,这个dp很好想, 下面就是最重要的了. 表示 ...

  2. NOIP2019 Emiya家今天的饭

    NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法 ...

  3. 【CSP-S2019】D2T1 Emiya 家今天的饭

    CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...

  4. 2019CSP-S Day2T1 Emiya 家今天的饭 题解

    2019CSP-S Day2T1 Emiya 家今天的饭 题解 题目链接 我太菜了 64pts,m<=3m <= 3m<=3. 前64pts数据规模都差不多,因为mmm很小,考虑类似 ...

  5. Emiya家今天的饭

    题目来源: Emiya家的饭 代码 #include <bits/stdc++.h> using namespace std; const int MOD = 998244353; con ...

  6. CSP-S2019学习笔记:Emiya家今天的饭

    题目名称看样子灵感来自于日本动画片"卫宫家今天的饭". 这道题的难度是"提高+/省选-",算是提高组里比较难的.数据范围分的很细,解题方法跟数据范围关系比较大. ...

  7. 【CSP-S 2019】【洛谷P5664】Emiya 家今天的饭【dp】

    题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述, ...

  8. 洛谷P5664 Emiya 家今天的饭

    题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim m1∼ ...

  9. Emiya 家今天的饭(CSP 2019 D2 T1)

    题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim ...

最新文章

  1. ICLR 2022论文列表公布,接收率高达32%
  2. 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)
  3. /bin/sh^M:损坏的解释器: No such file or directory
  4. bzoj4525[Usaco2016 Jan]Angry Cows
  5. 数值比较器实现_电动开窗器、手动开窗器使用介绍
  6. 转:11个实用但你可能不知道的Python程序库
  7. 从未后悔认识你,只是不知如何面对分开的结局
  8. JavaBean fields TO ExtjsMode fields
  9. 认识定制:JSON绑定概述系列
  10. 微信朋友圈删除后服务器还有吗,删了的朋友圈还可以找回来吗
  11. 2018-06-13 pymssql 访问 SQL Server 2017 或 pyodbc 访问支持 ODBC 的数据库
  12. 适配器自动分配的169开头的地址_代理ip地址怎么换
  13. 怎么创建css样式表,为HTML5表单创建CSS样式
  14. 常见的图标库有哪些?
  15. 仲裁器设计(4)Weighted Round Robin
  16. AQI空气质量分析与预测
  17. python和stata哪个数据分析实例,STATA数据分析案例:Zoutendijk可行方向法
  18. Mybatis注解-注解方式的动态SQL语句
  19. 【Java】对象的实例化
  20. 切片、切块、钻取和旋转

热门文章

  1. android报错空指针_Android空指针的问题。。
  2. 【哈工大威海】模式识别总结
  3. R语言21-多变量绘图
  4. 微信小程序 文字无法换行问题
  5. 【工具篇】10分钟快速学会React图表搭建
  6. 中国联通高峰:号码的安全及合规将是虚商工作重点
  7. 绅白不白2.0淘宝下载项目
  8. 校招C++编程题练习
  9. 小米手机关闭Activity直接回到了桌面
  10. 2017秋-软件工程第五次作业(1)-【探路者】团队选题展示(文案+美工)