本题主要考查滚动数组

dpi,j,kdp_{i,j,k}dpi,j,k​表示前iii种烹饪方法,假设最多的是食材jjj,食材jjj比其他食材多kkk次出现

其中i∈[1,n],j∈[1,m],k∈[−n,n]i \in [1,n],j \in [1,m],k \in [-n,n]i∈[1,n],j∈[1,m],k∈[−n,n]

then⟹dpi,j,k=dpi−1,j,k+∑l=1m(l=j?dpi−1,j,k−1:dpi−1,j,k+1)then \Longrightarrow dp_{i,j,k}=dp_{i-1,j,k}+\sum_{l=1}^{m}(l=j?dp_{i-1,j,k-1} :dp_{i-1,j,k+1})then⟹dpi,j,k​=dpi−1,j,k​+∑l=1m​(l=j?dpi−1,j,k−1​:dpi−1,j,k+1​)

总可能(不一定合法)为∏i=1n(1+∑j=1mai,j)\prod_{i=1}^{n}(1+\sum_{j=1}^{m}a_{i,j})∏i=1n​(1+∑j=1m​ai,j​),

不合法的为111(没有菜)+∑i=1m∑j=1ndpn,i,j+\sum_{i=1}^{m}\sum_{j=1}^{n}dp_{n,i,j}+∑i=1m​∑j=1n​dpn,i,j​

当然,转移时可以用刷表法,把转移从O(m)O(m)O(m)到O(1)O(1)O(1)

还有,要开滚动数组(或者用int,只不过打着麻烦些)

#include<cstdio>
#include<algorithm>
using namespace std;
# define Type template<typename T>
# define read read1<int>()
Type inline T read1()
{T t=0;bool ty=0;char k;do k=getchar(),(k=='-')&&(ty=1);while('0'>k||k>'9');do t=(t<<3)+(t<<1)+(k^'0'),k=getchar();while('0'<=k&&k<='9');return ty?-t:t;
}
# define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
# define ll long long
# define mod 998244353ll
ll dp[2][2003][203];
int s,f[103][2003],m;
ll sum[103];
int main()
{//fre("meal");s=read,m=read;for(int i=0;i++^s;)for(int j=0;j++^m;sum[i]%=mod)sum[i]+=f[i][j]=read;ll ans=1;for(int i=0;i++^s;)ans=ans*(sum[i]+1)%mod;for(int i=0;i++^m;)dp[0][i][100]=1;for(int i=0;i^s;++i)for(int j=0;j++^m;)for(int k=-100;k<=100;++k)if(dp[i&1][j][k+100]){(dp[~i&1][j][k+100]+=dp[i&1][j][k+100])%=mod;(dp[~i&1][j][k+99]+=dp[i&1][j][k+100]*(sum[i+1]-f[i+1][j]))%=mod;(dp[~i&1][j][k+101]+=dp[i&1][j][k+100]*f[i+1][j])%=mod;dp[i&1][j][k+100]=0;}for(int j=0;j++^m;)for(int k=101;k<=200;++k)if(dp[s&1][j][k])ans=(ans-dp[s&1][j][k])%mod;printf("%lld",(ans-1+mod)%mod);return 0;
}

(2019Csp_s D2 T1)Emiya 家今天的饭相关推荐

  1. 2019 CSP-S Day2 T1 Emiya 家今天的饭(DP)

    题目 Description Input Output 输出到文件 meal.out 中. 仅一行一个整数,表示所求方案数对 998, 244, 353 取模的结果. Sample Input Sam ...

  2. CSPS 2019 Day2 T1 Emiya 家今天的饭(容斥 + 计数 dp)

    Description 给定一个 n×mn \times mn×m 的矩阵,每一行最多选一个数,每一列可以选若干个数,但是每一列选的数不能超总数的一半.求有多少个不同的方案数. Solution 容斥 ...

  3. NOIP2019 Emiya家今天的饭

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

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

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

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

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

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

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

  7. Emiya家今天的饭

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

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

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

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

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

最新文章

  1. 程序员,不要急于学习编程语言,先学会如何解决问题
  2. 048_输出一下short的所有值
  3. windowsphone开发_APP软件开发用哪些软件比较好
  4. Leetcode 25 K个一组翻转链表 (每日一题 20210719)
  5. 【JavaScript代码实现四】获取和设置 cookie
  6. 不同网段通过静态路由实现互通,华为S5700交换机开启SSH远程指定IP登陆配置(强烈推荐)
  7. 无法从服务器获得响应,什么是java.io.EOFException的,消息:无法从服务器读取响应。 预期读4个字节,...
  8. Linux Fedora8 下安装 IE6
  9. 为什么要与下属建立良好的人际关系?
  10. C中error的使用
  11. HTML页面跳转的5种方法分析介绍
  12. 全电发票的最新进展:有关咨询整理(上篇)
  13. 三极管工作原理_10分钟分析稳压三极管工作原理
  14. NOIP数学学习笔记 Sakura_xyz
  15. 如何利用Slack客户端漏洞窃取Slack用户下载的所有文件
  16. 邮件发送失败服务器繁忙,★邮件发送失败的原因和解决方法
  17. ProcessStartInfo处理方法
  18. MapReduce系列之MapReduce的输入
  19. 如何有效的杜绝“羊毛党“的薅羊毛行为?
  20. bugku 0和1的故事 用Excel完成

热门文章

  1. hexo下NexT的主题背景及框体透明度修改
  2. jxl.write.biff.RowsExceededException: The maximum number of rows permitted on a worksheet been exce
  3. 【python小技巧】花式表白之动态二维码,这个gif有点帅哦
  4. Java项目实现手机令牌登录Google
  5. 【5G移动通信】5G面临的问题及潜在关键技术
  6. 第六周Android实习笔记
  7. Xcode 史上最全canOpenURL: failed问题解决办法
  8. 管理信息系统需要哪些计算机基础,管理信息系统以先进的计算机系统为物质基础,不需要人工参与。...
  9. 转转合并找靓机,能为其野心带来“转机”吗?
  10. 华为ENSP配置虚拟网关协议VRRP