NOIP2019 Emiya家今天的饭

NOIP2019 Emiya家今天的饭

ACM退役选手远程口胡
csf如今真的是太菜了,最后16分的做法愣是想了一下午
考虑使用容斥方法:

1

采用动态规划,先求出在无限制情况下,安排kkk种烹饪方法总的方案数.
dp2[i][j]dp2[i][j]dp2[i][j]表示已经考虑完前iii种烹饪方法,共做了jjj个菜的方案数.
那么显然,决策分2种情况,用或不用第iii种烹饪方法,用的话就只能选一种主要食材.
dp2[i][j]=dp2[i−1][j]+dp2[i−1][j−1]∗(∑t=1ma[i][t])dp2[i][j]=dp2[i-1][j] + dp2[i-1][j-1]*(\sum_{t=1}^m a[i][t])dp2[i][j]=dp2[i1][j]+dp2[i1][j1](t=1ma[i][t])
时间复杂度O(n2)O(n^2)O(n2),∑t=1ma[i][t]\sum_{t=1}^m a[i][t]t=1ma[i][t]可以提前维护好.

2

采用动态规划,计算出那些不合法的方案,并将这些方案减掉.
因为每次只能有一个主要食材不合法.所以对每个主要食材单独考虑,假设当前ttt食材不合法了.
最朴素的想法是,采用dp1[i][j][k]dp1[i][j][k]dp1[i][j][k]表示考虑完前iii烹饪方法,已经做了jjj个菜,使用ttt食材的有kkk个的方案数.

那么,决策就是第iii中烹饪方案选不选,选了之后,选不选ttt作为食材,一共333个转移.

记录linesum[i]=∑t=1ma[i][t]linesum[i]=\sum_{t=1}^m a[i][t]linesum[i]=t=1ma[i][t]

dp1[i][j][k]=dp1[i−1][j][k]+dp1[i−1][j−1][k−1]∗a[i][t]+dp1[i−1][j−1][k]∗(linesum[i]−a[i][t])dp1[i][j][k]=dp1[i-1][j][k]+dp1[i-1][j-1][k-1]*a[i][t]+dp1[i-1][j-1][k]*(linesum[i]-a[i][t])dp1[i][j][k]=dp1[i1][j][k]+dp1[i1][j1][k1]a[i][t]+dp1[i1][j1][k](linesum[i]a[i][t])

最后答案减去dp1[n][j][k]∣k>j/2dp1[n][j][k]|_{k \gt j/2}dp1[n][j][k]k>j/2

时间复杂度为O(n3m)O(n^3m)O(n3m),只能过84分,接下来继续优化

事实上,我们无需同时记录jjjkkk,而只需要记录k−(j−k)k - (j-k)k(jk)的值就足够了,也就是ttt食材的数量和非ttt食材的数量.

这样的话,记录dp1[i][Δ]dp1[i][\Delta]dp1[i][Δ]表示考虑完前iii行,选取的ttt食材和非ttt食材的差值为Δ\DeltaΔ时候,方案数.
转移方程如下
dp1[i][Δ]=dp1[i−1][Δ]+dp1[i−1][Δ−1]∗a[i][t]+dp1[i−1][Δ+1]∗(linesum[i]−a[i][t])dp1[i][\Delta]=dp1[i-1][\Delta] + dp1[i-1][\Delta-1]*a[i][t]+dp1[i-1][\Delta+1]*(linesum[i]-a[i][t])dp1[i][Δ]=dp1[i1][Δ]+dp1[i1][Δ1]a[i][t]+dp1[i1][Δ+1](linesum[i]a[i][t])
最后答案减去dp1[n][Δ]∣Δ>0dp1[n][\Delta]|_{\Delta>0}dp1[n][Δ]Δ>0
时间复杂度O(n2m)O(n^2m)O(n2m)

综上,总的时间复杂度O(n2m)O(n^2m)O(n2m)

AC代码

#include <iostream>
#include <cstring>
using namespace std;
#define int long long
const int MOD = 998244353;
const int maxn = 107,maxm = 2007;
int dp1[maxn][2*maxn]; //
int dp2[maxn][maxn];
int linesum[maxn]; //s1表示
int a[maxn][maxm];
int n, m;
signed main() {cin >> n >> m;for(int i = 1;i <= n;++i) {for(int j = 1;j <= m;++j) {cin >> a[i][j];a[i][j] %= MOD;linesum[i] = ( linesum[i] + a[i][j] ) % MOD;}}int ans = 0;for(int t = 1;t <= m;++t) {memset(dp1,0,sizeof(dp1));dp1[0][0 + 100] = 1;for(int i = 1;i <= n;++i) {for(int j = -i + 100;j <= i + 100;++j) {dp1[i][j] = dp1[i-1][j];dp1[i][j] += (dp1[i-1][j-1] * a[i][t]) % MOD;//取dp1[i][j] += (dp1[i-1][j+1] * ((linesum[i] - a[i][t] + MOD) % MOD)) % MOD;//不取dp1[i][j] %= MOD;}}for(int j = 1;j <= n;++j) {ans = (ans - dp1[n][j + 100]) % MOD;}}dp2[0][0] = 1;for(int i = 1;i <= n;++i) {for(int j = 0;j <= i;++j) {dp2[i][j] = dp2[i-1][j];for(int k = 1;k <= m;++k) {dp2[i][j] += dp2[i-1][j-1] * a[i][k] % MOD;dp2[i][j] %= MOD;}}}for(int j = 1;j <= n;++j)ans = (ans + dp2[n][j]) % MOD;cout << ans << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

一、案例结构总览这里&#xff0c;假设我们有两个客户端&#xff08;一个Web网站&#xff0c;一个移动App&#xff09;&#xff0c;他们要使用系统&#xff0c;需要先向IdentityService进行Login以进行验证并获取Token&#xff0c;在IdentityService的验证过程中会访问数据库以…

牛客练习赛71C-数学考试【容斥,dp】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7745/C 题目大意 求一nnn的排列&#xff0c;给mmm个限制pip_ipi​表示1∼pi1\sim p_i1∼pi​不能是pip_ipi​的排列。求方案数。 解题思路 定义fif_ifi​表示1∼pi1\sim p_i1∼pi​是pip_ipi​的排列的情况下1∼pi1\sim …

【DP】景观美化

景观美化 题目大意&#xff1a; 有n个花圃&#xff0c;里面有一定的泥土&#xff0c;可以将泥土运到别的花圃&#xff0c;也可以填入&#xff0c;也可以挖出&#xff0c;现在要改变花圃中的泥土数量&#xff0c;问最少花多少钱 原题&#xff1a; 题目描述&#xff1a; 农夫…

CentOS安装使用.netcore极简教程(免费提供学习服务器)

本文目标是指引从未使用过Linux的.Neter&#xff0c;如何在CentOS7上安装.Net Core环境&#xff0c;以及部署.Net Core应用。 仅针对CentOS&#xff0c;其它Linux系统类似&#xff0c;命令环节稍加调整&#xff1b;需要提前准备好服务器地址、用户名、密码&#xff1b;如果手上…

ASP.NET Core MVC+EF Core从开发到部署

笔记本电脑装了双系统&#xff08;Windows 10和Ubuntu16.04&#xff09;快半年了&#xff0c;平时有时间就喜欢切换到Ubuntu系统下耍耍Linux&#xff0c;熟悉熟悉Linux命令、Shell脚本以及Linux下的各种应用的安装、配置、运行。使用下来的感受是Linux确实相当好使&#xff0c;…

初一模拟赛(4.27)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf320320320100100100100100100100100100202020222hkyhkyhky296296296100100100100100100868686101010333wjjwjjwjj276276276100100100909090868686000444fyfyfy24824824810010010…

P4145-上帝造题的七分钟2/花神游历各国【并查集,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P4145 题目大意 一个序列要求支持 区间开根向下取整区间求和 解题思路 一个数开根约logloglog次就会到111&#xff0c;所以我们对于每个数记录一下开根多少次会到111&#xff0c;每次修改用并查集找还没到111的暴力修改树状…

网络流及建模专题(上)

前言 不断更新中…… 这几天新坑填不下去了&#xff0c;回来回顾一些经典的模型套路&#xff0c;先拿网络流开刀&#xff0c;窃以为洛谷这几道网络流的题目还是非常具有代表性的&#xff0c;涵盖了网络流调整、多解计数、最小割、最大权闭合子图问题。 还涵盖了图论&#xff0…

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性&#xff0c;巧妙的现实高性能im系统。为表诚意&#xff0c;先贴源码地址&#xff1a;https://github.com/2881099/im下载源码后的运行方法&#xff1a;运行环境&#xff1a;.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…

【并查集】【图论】旅行(ssl 1312)

旅行 ssl 1312 题目大意&#xff1a; 有一个图&#xff0c;要从一个点到另一个点&#xff0c;问路上的最大值和最小值的比最小是多少 原题&#xff1a; 题目描述 Z小镇是一个景色宜人的地方&#xff0c;吸引来自各地的观光客来此旅游观光。Z小镇附近共有N个景点&#xff…

P4302-[SCOI2003]字符串折叠【区间dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4302 题目大意 一个字符串&#xff0c;对于一个字符串AAA。可以将连续的nnn个AAA缩成n(A)n(A)n(A)。求最短的长度能够表述出给定字符串 解题思路 定义fi,jf_{i,j}fi,j​表示表示出i∼ji\sim ji∼j的字符串的最短方法。那么…

ACM/ICPC 比赛生涯总结+经验分享

ACM/ICPC 比赛生涯总结经验分享 1.获奖经历 时间比赛奖励大一下ACM陕西省赛打铁大一下CCCC团队二等奖大二下ACM/ICPC全国邀请赛银奖大二下CCCC团队特等奖大三上ACM/ICPC区域赛沈阳站铜奖大三上ACM/ICPC区域赛南宁站银奖大三上ACM/ICPC EC-Final上海铜奖大三下CCCC团队特等奖大…

YbtOJ#20064-[NOIP2020模拟赛B组Day4]预算缩减【树形dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/2 题目大意 nnn个点的一棵树&#xff0c;求删掉一些边让剩下的连通块大小不小于kkk&#xff0c;求方案数。 解题思路 定义fi,jf_{i,j}fi,j​表示iii的子树现在联通块大小为jjj时的方案数&#xff0c;我们不难发现…

【并查集】团伙(luogu 1892)

团伙 luogu 1892 代码&#xff1a; 定义对手的对手是朋友&#xff0c;朋友的朋友是朋友&#xff0c;现在有n个人和m组关系&#xff0c;如果两个人是朋友那么他们属于同一个团伙&#xff0c;问有多少个团伙 原题&#xff1a; 题目描述 1920年的芝加哥&#xff0c;出现了一…

NCC Meetup 2018 Shanghai 活动小结

NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行。原本计划30人规模的小型活动&#xff0c;结果收到了逾60人的报名&#xff0c;其中大部均来到现场参加了活动。本次活动得到了微软公司的场地支持&#xff0c;同时非常感谢 范亮先生、 刘浩杨先生和 邹嵩…

【结论】Array

Array 题目大意&#xff1a; 有一个数列&#xff0c;随机交换两个数&#xff0c;原数列和当前数列相同部分有可能有多少个 原题&#xff1a; 题目描述 Alice 有一个数列 ai。 但是她不喜欢这个数列&#xff0c;于是她决定随机交换其中两个数。 Alice 想知道&#xff0c;交…

YbtOJ#20065-[NOIP2020模拟赛B组Day4]模拟比赛【dp】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/3 解题思路 有nnn道题&#xff0c;mmm个人。一些题目是让某些人一定得分&#xff0c;一些题目是让某些人可以能得分。 求排名前sss的人选出ttt个人&#xff0c;可能的集合个数。 解题思路 显然我们如果要判断一…

Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

今天抽出一点点时间来造一个小轮子&#xff0c;是关于定时任务这块的。这篇文章主要从一下几点介绍&#xff1a;创建数据库管理表创建web项目引入quarzt nuget 包写具体配置操作&#xff0c;实现定时任务处理第一步&#xff1a;创建一个空web项目&#xff0c;引入quarzt nuget …

YbtOJ#20066-[NOIP2020模拟赛B组Day4]筹备计划【线段树,树状数组】

正题 题目链接:http://noip.ybtoj.com.cn/contest/90/problem/4 题目大意 一个集合[1,n]∈S[1,n]\in S[1,n]∈S&#xff0c;和一个序列aaa。有操作 序列aaa的一个数加上xxx序列aaa的一个数减去xxx将[l,r][l,r][l,r]加入集合SSS将[l,r][l,r][l,r]删除出集合SSS 每次修改后求…

【模拟】Biotech

Biotech 题目大意&#xff1a; 有一堆细胞&#xff08;放电或不放电&#xff09;&#xff0c;当周围细胞放电个数小于2或大于3时&#xff08;八个方向&#xff09;&#xff0c;此细胞变为不放电&#xff0c;当周围细胞放电个数为2时&#xff0c;此细胞不变&#xff0c;当周围…