\(dp_{i,j,k}\)表示前\(i\)种烹饪方法,假设最多的是食材\(j\),食材\(j\)比其他食材多\(k\)次出现

其中\(i \in [1,n],j \in [1,m],k \in [-n,n]\)

\(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})\)

本题主要考查滚动数组

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

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

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

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

\(\mathfrak{talk\ is\ cheap,show\ you\ the\ code}\)

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. # define Type template<typename T>
  5. # define read read1<int>()
  6. Type inline T read1()
  7. {
  8. T t=0;
  9. bool ty=0;
  10. char k;
  11. do k=getchar(),(k=='-')&&(ty=1);while('0'>k||k>'9');
  12. do t=(t<<3)+(t<<1)+(k^'0'),k=getchar();while('0'<=k&&k<='9');
  13. return ty?-t:t;
  14. }
  15. # define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout)
  16. # define ll long long
  17. # define mod 998244353ll
  18. ll dp[2][2003][203];
  19. int s,f[103][2003],m;
  20. ll sum[103];
  21. int main()
  22. {
  23. //fre("meal");
  24. s=read,m=read;
  25. for(int i=0;i++^s;)
  26. for(int j=0;j++^m;sum[i]%=mod)
  27. sum[i]+=f[i][j]=read;
  28. ll ans=1;
  29. for(int i=0;i++^s;)
  30. ans=ans*(sum[i]+1)%mod;
  31. for(int i=0;i++^m;)
  32. dp[0][i][100]=1;
  33. for(int i=0;i^s;++i)
  34. for(int j=0;j++^m;)
  35. for(int k=-100;k<=100;++k)
  36. if(dp[i&1][j][k+100])
  37. {
  38. (dp[~i&1][j][k+100]+=dp[i&1][j][k+100])%=mod;
  39. (dp[~i&1][j][k+99]+=dp[i&1][j][k+100]*(sum[i+1]-f[i+1][j]))%=mod;
  40. (dp[~i&1][j][k+101]+=dp[i&1][j][k+100]*f[i+1][j])%=mod;
  41. dp[i&1][j][k+100]=0;
  42. }
  43. for(int j=0;j++^m;)
  44. for(int k=101;k<=200;++k)
  45. if(dp[s&1][j][k])
  46. ans=(ans-dp[s&1][j][k])%mod;
  47. printf("%lld",(ans-1+mod)%mod);
  48. return 0;
  49. }

Emiya 家今天的饭的更多相关文章

  1. 洛谷P5664 Emiya 家今天的饭 问题分析

    首先来看一道我编的题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共 ...

  2. 洛谷P5664 Emiya 家今天的饭 题解 动态规划

    首先来看一道题题: 安娜写宋词 题目背景 洛谷P5664 Emiya 家今天的饭[民间数据] 的简化版本. 题目描述 安娜准备去参加宋词大赛,她一共掌握 \(n\) 个 词牌名 ,并且她的宋词总共有 ...

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

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

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

    Description 传送门 Solution 算法1 32pts 爆搜,复杂度\(O((m+1)^n)\) 算法2 84pts 裸的dp,复杂度\(O(n^3m)\) 首先有一个显然的性质要知道: ...

  5. CSP2019 Emiya 家今天的饭 题解

    这题在考场上只会O(n^3 m),拿了84分.. 先讲84分,考虑容斥,用总方案减去不合法方案,也就是枚举每一种食材,求用它做超过\(\lfloor \frac{k}{2} \rfloor\) 道菜的 ...

  6. 【NOIP/CSP2019】D2T1 Emiya 家今天的饭

    这个D2T1有点难度啊 原题: 花了我一下午的时间,作为D2T1的确反常 条件很奇怪,感觉不太直观,于是看数据范围先写了个暴力 写暴力的时候我就注意到了之前没有仔细想过的点,烹饪方式必须不同 虽然a很 ...

  7. csp2019 Emiya家今天的饭题解

    qwq 由于窝太菜了,实在是不会,所以在题解的帮助下过掉了这道题. 写此博客来整理一下思路 正文 传送 简化一下题意:现在有\(n\)行\(m\)列数,选\(k\)个数的合法方案需满足: 1.一行最多 ...

  8. 【JZOJ6433】【luoguP5664】【CSP-S2019】Emiya 家今天的饭

    description analysis 首先可以知道不符合要求的食材仅有一个,于是可以容斥拿总方案数减去选不合法食材的不合法方案数 枚举选取哪一个不合法食材,设\(f[i][j]\)表示到第\(i\ ...

  9. CSP2019 Emiya 家今天的饭

    Description: 有 \(n\) 中烹饪方法和 \(m\) 种食材,要求: 至少做一种菜 所有菜的烹饪方法各不相同 同种食材的菜的数量不能超过总菜数的一半 求做菜的方案数. Solution1 ...

随机推荐

  1. React Core Features

    React Core Features Here is a summary of the core features. We will cover each feature in detail thr ...

  2. Chomp类游戏——必胜策略分析

    首先介绍一个重要定理——策梅洛定理(Zermelo) 策梅洛定理,表明在二人参与的游戏/博弈中,如果满足: --------游戏的步骤数有限 --------信息完备(二人都了解游戏规则,了解游戏曾经 ...

  3. 第3章 Spring AOP

    3.1 Spring AOP简介 3.11什么是AOP? AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充 ...

  4. LeetCode 1249. Minimum Remove to Make Valid Parentheses

    原题链接在这里:https://leetcode.com/problems/minimum-remove-to-make-valid-parentheses/ 题目: Given a string s ...

  5. Xml解析作业与Xml建模andXml建模作业

    作业:config.xml解析 1.获取所有action中的type的值 public static void main(String[] args) throws Exception { Input ...

  6. P4211 [LNOI2014]LCA LCT

    P4211 [LNOI2014]LCA 链接 loj luogu 思路 多次询问\(\sum\limits_{l \leq i \leq r}dep[LCA(i,z)]\) 可以转化成l到r上的点到根 ...

  7. string类的用法总结

    string中常见的成员函数 示例代码: string s= string("abcdefg"); char ch[] = "abcdefgd"; //调用构造 ...

  8. Java GUI 的基础学习

    Java Swing的学习: 重点理解容器类(Container)和组件类(Component): Java把component类的子类或间接子类创建的对象称为一个组件 Java把Container的 ...

  9. javaScript 判断为false

    JavaScript把null.undefined.0.NaN和空字符串''视为false,其他值一概视为true

  10. leetcode:7. 整数反转

    题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例: 输入: 123 输出: 321 输入: -123 输出: -321 输入: 120 输出: 21 注意:假 ...