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

题目链接

我太菜了

  • 64pts,m<=3m <= 3m<=3.

  • 前64pts数据规模都差不多,因为mmm很小,考虑类似背包的做法,设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示到了第i行,每种食材各用了多少的方案数,转移如下:

       f[0][0][0][0] = 1;rep(i,1,n)rep(j,0,i)rep(k,0,i)rep(l,0,i){if(j)f[i][j][k][l] = (f[i][j][k][l] + f[i - 1][j - 1][k][l] * a[i][1]) % mod;if(k)f[i][j][k][l] = (f[i][j][k][l] + f[i - 1][j][k - 1][l] * a[i][2]) % mod;if(l)f[i][j][k][l] = (f[i][j][k][l] + f[i - 1][j][k][l - 1] * a[i][3]) % mod;f[i][j][k][l] = (f[i][j][k][l] + f[i - 1][j][k][l]) % mod;}rep(i,0,n)rep(j,0,n)rep(k,0,n){//统计答案if(i + j + k > n)continue;if(i > j + k)continue;if(j > i + k)continue;if(k > i + j)continue;ans = (ans + f[n][i][j][k]) % mod; }
    
  • 代码写的比较丑.

  • 88pts,也就是这题的正解,省一该有的分数,m<=500m <= 500m<=500

  • 因为最多有一种食材会超过一半,我们把这种食材和其他剩下的食材分开考虑,设f[i][j][k]f[i][j][k]f[i][j][k]表示到了第i行,最多的一种食材选了j个,剩下的食材选了k个,合法的情况很多,但不合法的只有j>kj > kj>k 一种,所以答案是全部的方案数减掉这一种。

  • 转移以及答案统计:

      rep(i,1,n){rep(j,1,m){scanf("%lld",&a[i][j]);s[i] = (s[i] + a[i][j]) % mod; }}ans = 1;rep(i,1,n)ans = (ans * (s[i] + 1)) % mod;rep(l,1,m){memset(f,0,sizeof(f));f[0][0][0] = 1;rep(i,1,n)rep(j,0,i)rep(k,0,i){f[i][j][k] += f[i - 1][j][k];if(j) f[i][j][k] += f[i - 1][j - 1][k] * a[i][l];if(k) f[i][j][k] += f[i - 1][j][k - 1] * ((s[i] - a[i][l] + mod) % mod);f[i][j][k] %= mod;}rep(i,1,n)rep(j,0,n - i){if(i > j)ans = (ans - f[n][i][j] + mod) % mod; }}ans = (ans - 1 + mod) % mod;
    
  • 100pts,这档分我高中没人能拿到,n<=100,m<=2000n <= 100,m <= 2000n<=100,m<=2000

  • 刚刚那种做法复杂度为O(mn3)O(mn_{}^{3})O(mn3​),满分做法就是动了一下脑子,我们实际关心的只是j,kj,kj,k的大小关系,所以只需要维护j−kj - kj−k的差值,时间和空间都降下一维,一看就很像标算,大胆细心的写就好。

  • code如下:

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <set>
    #include <vector>
    #include <cstring>
    #include <cctype>
    #include <map>
    #define ll long long
    #define rep(a,b,c) for(int a = b;a <= c;++a)
    #define per(a,b,c) for(int a = b;a >= c;--a)
    #define N 110
    #define M 2010
    #define mod 998244353using namespace std;int n,m;
    ll f[N][N << 1];//到了第i行,最多的为j,其他的为k,j - k + 100的差值
    ll a[N][M];
    ll s[N];//i行全部的数量
    ll ans;int main(){scanf("%d %d",&n,&m);ans = 1;rep(i,1,n){rep(j,1,m){scanf("%lld",&a[i][j]);s[i] = (s[i] + a[i][j]) % mod;}ans = (ans * (s[i] + 1)) % mod;}rep(k,1,m){memset(f,0,sizeof(f));f[0][100] = 1;rep(i,1,n){rep(j,100-i,100+i){f[i][j] = (f[i][j] + f[i - 1][j]) % mod;f[i][j] = (f[i][j] + f[i - 1][j + 1] * ((s[i] - a[i][k] + mod) % mod)) % mod;if(j > 0)f[i][j] = (f[i][j] + f[i - 1][j - 1] * a[i][k]) % mod;}}rep(i,101,100 + n)ans = (ans - f[n][i] + mod) % mod;}ans = (ans - 1 + mod) % mod;printf("%lld\n",ans);return 0;
    }

Thanks.

2019CSP-S Day2T1 Emiya 家今天的饭 题解相关推荐

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

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

  2. 「CSP-S 2019」 Emiya 家今天的饭 题解

    题面 样例 2 3 1 0 1 0 1 1 3 分析 考虑正着限制最大的数不超过一半不好做,那我们可以反着来. 令 dp[i][j][k]dp[i][j][k]dp[i][j][k] 为第 iii 行 ...

  3. NOIP2019 Emiya家今天的饭

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

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

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

  5. Emiya家今天的饭

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

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

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

  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的学习笔记(0)之循环的使用1
  2. book mac pro怎么重装系统_MAC笔记本电脑解决NTFS硬盘无法写入的简要方法
  3. boost::mpl模块bind相关的测试程序
  4. python中向量长度_python中向量指的是什么意思
  5. mfc 隐藏主窗口 visible_第80讲:工作表数据与UserForm窗口的交互,记录的编辑和保存...
  6. Django(part29)--Q对象
  7. 微信、企业微信、支付窗、微博SDK 四合一,JeeWx-api 1.2.2 版本发布!
  8. (100)Verilog HDL:UART波特率设计
  9. 数据科学 IPython 笔记本 9.6 聚合:最小、最大和之间的任何东西
  10. Linux内核移植漫谈——你不是第一个想移植Linux内核的人
  11. java.lang.Object是如何成为默认父类的
  12. VSCode之调试html
  13. 机器学习基础:极大似然估计(Machine Learning Fundamentals: Maximum Likelihood Estimation)
  14. 标签系统 -- 用户画像
  15. 深入浅出mysql第二,mysql-深入浅出MySQL(第2版)-ITBook分享(pdf mongodb java javascript node )...
  16. H5唤起 uniapp 版的app 端
  17. 教你用优化视频的方法提高视频的质量
  18. matlab cody学习笔记 day18
  19. linux centos无法进入系统,centos无法进入桌面系统
  20. 蒲公英分布平台下载更新实现

热门文章

  1. Linux内存转储文件找不到?
  2. Gated-SCNN: Gated Shape CNNs for Semantic Segmentation论文笔记
  3. 青狐云网盘搭建-支持会员功能-支持对接阿里云存储
  4. 通过 Facebook 成功营销的技巧
  5. 实习笔记Day9(2022.8.17)
  6. 【算法基础】 数学预备知识1——集合、关系和函数
  7. ansible 修改文件变量_ansible学习心得
  8. 20200713 autojs requestScreenCapture 绕过请求截图权限
  9. Vue. 之 报错 Uncaught (in promise)
  10. 程序员必备学习资源资料库!!!免费开发书籍中文版大全