题目

Description


Input

Output

输出到文件 meal.out 中。
仅一行一个整数,表示所求方案数对 998, 244, 353 取模的结果。

Sample Input

Sample Input1
2 3
1 0 1
0 1 1

Sample Input2
3 3
1 2 3
4 5 0
6 0 0

Sample Input3
5 5
1 0 0 1 1
0 1 0 1 0
1 1 1 1 0
1 0 1 0 1
0 1 1 0 1

Sample Output

Sample Output1
3

Sample Output2
190

Sample Output3
742

Data Constraint

题解

  • 作为联赛的Day2-T1,理论上应该AC是应该不难的,
  • 但是,这道题偏偏难倒了我。。。考场上简直觉得这是神仙题!!!
  • 赛后一想,这题并没有那么难,随着一档又一档部分分的实现,我离正解越来越近,
  • 不得不说,这是一道质量很高的题(其实联赛题质量都挺高的),主要体现在分了许多子任务和它们各自的不同与联系。
  • 开始进入正题——
  • 观察满分数据大小,猜测正解的复杂度应该是O(n2m)O(n^2m)O(n2m)的。
  • 先想最简单的暴力怎么做?
  • 暴力搜索每种烹饪方法选用什么食材或不选该种烹饪方法,时间复杂度O(mn)O(m^n)O(mn),期望得分32分。
  • 发现每次DFS到下一种烹饪方法时,最多一种食材数量改变,
  • 又看到有64分数据的mmm特别小,想到可以DP,先枚举总共选多少种烹饪方法,再设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示当前选到第iii种食材,mmm种食材分别选了j,k,lj,k,lj,k,l个的方案数,如果m=1m=1m=1或222多余的k,lk,lk,l就恒为000,
  • 每次从f[i−1][j][k][l]f[i-1][j][k][l]f[i−1][j][k][l]或f[i−1][j−1][k][l]f[i-1][j-1][k][l]f[i−1][j−1][k][l]或f[i−1][j][k−1][l]f[i-1][j][k-1][l]f[i−1][j][k−1][l]或f[i−1][j][k][l−1]f[i-1][j][k][l-1]f[i−1][j][k][l−1]转移,须保证j,k,lj,k,lj,k,l不大于n2\frac{n}{2}2n​。
  • 时间复杂度O(n5)O(n^5)O(n5),其中nnn的指数会随mmm增大而增大,所以m>3m>3m>3时是过不去的,期望得分64分。
  • 如果m>3m>3m>3的话,该怎么记录呢?开若干维状态?还是状态压缩?还是什么奇技淫巧?似乎都是不行的。。。
  • 要是顺着这种思路下去,这题就只能拿到这么多分了!
  • (这就是考场上的我,心凉~~~)
  • 重新回到题目,要求每种食材使用次数不能超过总数的一半,想到容斥,用总方案数减去不合法的。
  • 总方案数用递推很好实现,那么不合法的呢?
  • 会发现无论怎么选,也最多只会有一种食材出现不合法(这个重要结论似乎很显然,可没想到是就是没想到),,,
  • 因此,我们枚举哪种食材不合法,然后简单地DP,
  • 记录当前总共选了多少个,且有多少个是不合法的那种。
  • 时间复杂度O(n3m)O(n^3m)O(n3m),期望得分84.
  • 显然要优化掉一个nnn,考虑减少一维状态,
  • 改成记录不合法减去合法的个数,最后这一维大于000的部分就是可以累计的答案,
  • 时间复杂度O(n2m)O(n^2m)O(n2m),期望得分100!

代码

#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
#define md 998244353
ll a[110][2010],f[110][210],sum[2010];
int main()
{freopen("meal.in","r",stdin);freopen("meal.out","w",stdout);int n,m,i,j,k,l;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)for(j=1;j<=m;j++) scanf("%d",&a[i][j]);f[0][0]=1;for(i=1;i<=n;i++){sum[i]=0;for(j=1;j<=m;j++) sum[i]=(sum[i]+a[i][j])%md;for(j=0;j<=i;j++) {f[i][j]=f[i-1][j];if(j) f[i][j]=(f[i][j]+f[i-1][j-1]*sum[i])%md;}}ll ans=0;for(i=1;i<=n;i++) ans=(ans+f[n][i])%md;for(k=1;k<=m;k++){f[0][n]=1;for(i=1;i<=n;i++){for(j=-i;j<=i;j++){f[i][j+n]=f[i-1][j+n];if(j>-i) f[i][j+n]=(f[i][j+n]+f[i-1][j-1+n]*a[i][k])%md;if(j<i) f[i][j+n]=(f[i][j+n]+f[i-1][j+1+n]*(sum[i]-a[i][k]+md))%md;}}for(i=1;i<=n;i++) ans=(ans-f[n][i+n]+md)%md;}printf("%lld",ans);fclose(stdin);fclose(stdout);return 0;
}

2019 CSP-S Day2 T1 Emiya 家今天的饭(DP)相关推荐

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

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

  2. CSP-S 2019————Emiya 家今天的饭————DP+思维

    题解:本题主要考查DP+思维. 简要题意:一个矩阵,要求每行只选一个节点,每列选的节点不能超过所有选的节点的一半,不能不选,给出每个节点的选择方案数,求总方案数. 1.DP+思维: (1).维护每列已 ...

  3. (2019Csp_s D2 T1)Emiya 家今天的饭

    本题主要考查滚动数组 dpi,j,kdp_{i,j,k}dpi,j,k​表示前iii种烹饪方法,假设最多的是食材jjj,食材jjj比其他食材多kkk次出现 其中i∈[1,n],j∈[1,m],k∈[− ...

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

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

  5. NOIP2019 Emiya家今天的饭

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

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

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

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

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

  8. Emiya家今天的饭

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

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

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

最新文章

  1. 怎么理解ASM中的Failgroup
  2. 是否能领先e步 浅析SSD中的eTLC和eMLC颗粒
  3. NV21数据 镜像 旋转
  4. python控制台输出颜色
  5. 49字母异位词分组(哈希表)
  6. 【NLP】相当全面:各种深度学习模型在文本分类任务上的应用
  7. android主板读取vga线数据_智锐通掘金新基建上新系列之3.5quot; 与ATX工业主板图鉴...
  8. C语言之预处理探究(二):条件编译(Condition Compile)
  9. win服务器自动发邮件,asp.net基于windows服务实现定时发送邮件的方法
  10. 【自然语言处理】--视觉问答(Visual Question Answering,VQA)从初始到应用
  11. Julia: 用PyPlot画Arrow以及策略信号的表达
  12. 叹为观止的Qt 3d控件
  13. vivado.2019.1 安装教程
  14. 电脑开机出现press f11 to start recovery system问题分析与解决
  15. 人工智能实战第六次作业_张绍恺
  16. 由内而外全面造就自己(七)
  17. 算符优先分析java程序_算符优先分析
  18. 蛋白质ph稳定性计算机模拟,蛋白质二聚体相互作用和识别的计算机模拟
  19. TBC法师raid用饰品
  20. nova launcher_如何安装Nova Launcher以获得更强大,可自定义的Android主屏幕

热门文章

  1. java.io.IOException: Cleartext HTTP traffic to dict.youdao.com not permitted
  2. [译]未雨绸缪之:静态资源处理
  3. 镭速-跨国车企数据高速、安全跨境传输解决方案
  4. 营销大数据如何帮助企业深入了解客户—镭速
  5. C# 字符串首字母大写其余小写
  6. 小型点阵屏后台监控系统研发
  7. 面试大厂不看这两份Java面试核心知识点原理篇+框架篇,有个屁用?食屎啦泥?
  8. 鸿翼深信服:携手共创数据宏图
  9. 使用js脚本进行网页截屏的尝试(图文)
  10. Noip2004普及组