CSP-S2019学习笔记:Emiya家今天的饭
题目名称看样子灵感来自于日本动画片“卫宫家今天的饭”。
这道题的难度是“提高+/省选-”,算是提高组里比较难的。数据范围分的很细,解题方法跟数据范围关系比较大。对于新手来说,可以从数据范围入手,一步一步推导出最终的正解。
前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家今天的饭相关推荐
- [CSP day2T1]Emiya 家今天的饭
Emiya 家今天的饭 题解 挺容易的一道dp,我们可以先考虑容斥.先加上不考虑菜数不超过一半的值,再减去超过一半的部分. 表示在前i种中选j个菜的总种类,这个dp很好想, 下面就是最重要的了. 表示 ...
- NOIP2019 Emiya家今天的饭
NOIP2019 Emiya家今天的饭 ACM退役选手远程口胡 csf如今真的是太菜了,最后16分的做法愣是想了一下午 考虑使用容斥方法: 1 采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法 ...
- 【CSP-S2019】D2T1 Emiya 家今天的饭
CSP-S2019 D2T1 Emiya 家今天的饭 题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 ...
- 2019CSP-S Day2T1 Emiya 家今天的饭 题解
2019CSP-S Day2T1 Emiya 家今天的饭 题解 题目链接 我太菜了 64pts,m<=3m <= 3m<=3. 前64pts数据规模都差不多,因为mmm很小,考虑类似 ...
- Emiya家今天的饭
题目来源: Emiya家的饭 代码 #include <bits/stdc++.h> using namespace std; const int MOD = 998244353; con ...
- Emiya 家今天的饭(CSP 2019 D2 T1)
题目 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim ...
- P5664 [CSP-S2019] Emiya 家今天的饭
太难惹!!! 文章目录 题目描述 一.分析 二.代码 总结 题目描述 Emiya 是个擅长做菜的高中生,他共掌握 n 种烹饪方法,且会使用 m 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1∼n ...
- 洛谷P5664 Emiya 家今天的饭
题目描述 Emiya 是个擅长做菜的高中生,他共掌握 nn 种烹饪方法,且会使用 mm 种主要食材做菜.为了方便叙述,我们对烹饪方法从 1 \sim n1∼n 编号,对主要食材从 1 \sim m1∼ ...
- 【CSP-S 2019】【洛谷P5664】Emiya 家今天的饭【dp】
题目 题目链接:https://www.luogu.org/problem/P5664 Emiya 是个擅长做菜的高中生,他共掌握 nnn 种烹饪方法,且会使用 mmm 种主要食材做菜.为了方便叙述, ...
最新文章
- Python的零基础超详细讲解(第十三天)-Python的类与对象
- MySQL二进制日志的三种模式解析
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列...
- 钉钉运营商服务器在哪,钉钉应用服务商
- Linux 内核中的宏定义
- 中英文对照 —— 图表等的可视化
- 浏览器插件之ActiveX开发(三)
- mysql 插入万条数据_你向 MySQL 插入 100万 条数据用了多久?
- Ubuntu 安装与使用 Rootkit 扫描程序
- FAIR田渊栋:从工程师到管理者,是让个人能力scale到团队中
- 淘宝带你走进——幽灵Crash迷踪案
- 第一行代码-第二版(郭霖著)笔记三(UI控件)
- 制程与良率,谁才是芯片厂商的竞赛底牌?
- 高中时候想的一个脑洞大开的故事
- 基于独立工作流引擎实现的SuperFlow工作流平台设计方案
- 计算机高水平竞赛,计算机科学技术学院学子在中国高校计算机大赛——网络技术挑战赛中取得优异成绩...
- 【百度点石(WSDM)】 Retention Rate of Baidu Hao Kan APP Users 小白经验分享
- vim编辑页面怎么退出_linux系统中如何进入退出vim编辑器
- js实现将时分秒转化成毫秒,将秒转化成时分秒
- 探讨浏览器指纹(科普)
热门文章
- 手撸一个springsecurity,了解一下security原理
- Python下利用epd_free安装pandas
- MES管理系统解决方案,主要实现的目标
- Visual Studio开发工具----调试技巧-转储文件
- python制作动态二维码步骤_【表白神器】自定义文字或链接并转成【动态二维码】,python编写...
- 利用定时器的输出比较功能产生PWM驱动舵机
- mysql-5.7.21-winx64安装教程
- GitHub使用说明(翻译原网站)
- 嵌入式硬件设计与实践(从硬件到产品)
- 孝感市高企培育,湖北省孝感市高企申报对象、流程、奖补