题目名称看样子灵感来自于日本动画片“卫宫家今天的饭”。

这道题的难度是“提高+/省选-”,算是提高组里比较难的。数据范围分的很细,解题方法跟数据范围关系比较大。对于新手来说,可以从数据范围入手,一步一步推导出最终的正解。

前8组数据,n不超过10,m等于2或3。可以直接用深度优先搜索暴力枚举所有的组合情况。

第9~16组数据,n为40,m仍然等于2或3。因为n比较大,若仍然用暴力枚举,则会超时。考虑到m等于2或m=3,可考虑用背包动态规划的思路来做,比如有三道菜A、B、C,那么有四种选法:不选、选A、选B、选C。

第17~21这四组数据,n = 40,m = 500,这种情况下,可将当前列的菜看成一种菜,剩余其他列的菜看成另一道菜。仍然是一个背包问题。这种解法有四层循环,其复杂度为m * n^3。将m和n的最大值代进去,则最多需要循环500 * 40^3 = 3200万次,这个计算量电脑还是可以承受的。

最后四组数组,n = 100, m = 2000,如果按上一步的解法,需要循环计算2000 * 100^3 = 20亿次,会超时。此时可将选某列菜与不选某列菜的差做为动态规划中数据的下标,这样数组可节省掉一维,循环次数变为m * n^2 = 2000 * 100^2 = 2千万次。

总体而言,这是一道优秀的动态规划题。学完这道题,对动态规划的理解会更深入一层。

附AC代码:

//Zheng Haishu, 2020-2-15
# include <cstdio>
# include <iostream>
# include <memory.h>
using namespace std;const int N = 110;
const int M = 2010;
const int offset = 110;
const int mod = 998244353;typedef long long LL;int n, m, a[N][M];
LL s[N], dp[offset][2*offset], ans;int main()
{//freopen("meal4.in", "r", stdin);cin >> n >> m;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> a[i][j];}}ans = 1;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){s[i]=(s[i] + a[i][j]) % mod;}ans = ans * (s[i] + 1) % mod;}for(int col = 1; col <= m; col++){memset(dp, 0, sizeof(dp));dp[0][offset] = 1; //使用offset是为了偏移数组下标,使下标不小于0for(int i = 1; i <= n; i++)//i表示行{for(int j = -1 * i; j <= i; j++)//j表示不选第col列减去选第col列{//选第col列dp[i][j+offset] += dp[i-1][j-1+offset] * a[i][col];dp[i][j+offset] %= mod;//不选第col列dp[i][j+offset] += dp[i-1][j+1+offset] * ((s[i] - a[i][col] + mod) % mod);dp[i][j+offset] %= mod;dp[i][j+offset] += dp[i-1][j+offset];dp[i][j+offset] %= mod;}}for(int i = 1; i <= n; i++){ans = (ans - dp[n][i+offset] + mod) % mod;}}printf("%lld\n", ans - 1); //减掉都不减即dp[0][offset]return 0;
}

了解信息学奥赛请加微信307591841或QQ群581357582

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. Emiya 家今天的饭(CSP 2019 D2 T1)

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

  7. P5664 [CSP-S2019] Emiya 家今天的饭

    太难惹!!! 文章目录 题目描述 一.分析 二.代码 总结 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 n 种烹饪方法,且会使用 m 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1∼n ...

  8. 洛谷P5664 Emiya 家今天的饭

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

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

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

最新文章

  1. Python的零基础超详细讲解(第十三天)-Python的类与对象
  2. MySQL二进制日志的三种模式解析
  3. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
  4. 钉钉运营商服务器在哪,钉钉应用服务商
  5. Linux 内核中的宏定义
  6. 中英文对照 —— 图表等的可视化
  7. 浏览器插件之ActiveX开发(三)
  8. mysql 插入万条数据_你向 MySQL 插入 100万 条数据用了多久?
  9. Ubuntu 安装与使用 Rootkit 扫描程序
  10. FAIR田渊栋:从工程师到管理者,是让个人能力scale到团队中
  11. 淘宝带你走进——幽灵Crash迷踪案
  12. 第一行代码-第二版(郭霖著)笔记三(UI控件)
  13. 制程与良率,谁才是芯片厂商的竞赛底牌?
  14. 高中时候想的一个脑洞大开的故事
  15. 基于独立工作流引擎实现的SuperFlow工作流平台设计方案
  16. 计算机高水平竞赛,计算机科学技术学院学子在中国高校计算机大赛——网络技术挑战赛中取得优异成绩...
  17. 【百度点石(WSDM)】 Retention Rate of Baidu Hao Kan APP Users 小白经验分享
  18. vim编辑页面怎么退出_linux系统中如何进入退出vim编辑器
  19. js实现将时分秒转化成毫秒,将秒转化成时分秒
  20. 探讨浏览器指纹(科普)

热门文章

  1. 手撸一个springsecurity,了解一下security原理
  2. Python下利用epd_free安装pandas
  3. MES管理系统解决方案,主要实现的目标
  4. Visual Studio开发工具----调试技巧-转储文件
  5. python制作动态二维码步骤_【表白神器】自定义文字或链接并转成【动态二维码】,python编写...
  6. 利用定时器的输出比较功能产生PWM驱动舵机
  7. mysql-5.7.21-winx64安装教程
  8. GitHub使用说明(翻译原网站)
  9. 嵌入式硬件设计与实践(从硬件到产品)
  10. 孝感市高企培育,湖北省孝感市高企申报对象、流程、奖补