UPD:修了点锅(啊昨天居然写脑抽了)

题目内容

给定两个长度为 \(n\) 的序列,定义 \(magic(A,B)=\sum\limits_{i=1}^n \max(A_i,B_i)\)。

现在给定 \(n,K\) 问有多少对 \((A,B)\) 满足 \(magic(A,B)\geq K\)。

结果 \(\mathrm{mod}\ 998244353\)。

思路

关于数据太水导致特判大法直接AC这件事重评了

关于两重排列,可以将 \(B\) 序列固定为 \(1、2、3\dots n\),最后方案数乘上 \(n!\) 。因为实际上最后变换的就是每一对的位置。然后考虑填 \(A\) 序列。

设 \(f[i][j][k]\) 表示当前填完了 \(1\) ~ \(i\) 的数,其中有 \(j\) 个数填到了下标为 \(i+1\) ~ \(n\) 的位置,\(k\) 为所有 \(\max\{ a[p],b[p] \}\leq i\) 中 \(\max\{ a[p],b[p] \}\) 的和的方案数。

转移分类讨论:

  1. 若将 \(i\) 填到了下标 \(i\) ,则k+=i

  2. 若将 \(i\) 填到了下标小于 \(i\) 的位置,下标 \(i\) 的位置填入了小于 \(i\) 的数,则k+=2*ij--

  3. 若将 \(i\) 填到了下标小于 \(i\) 的位置,下标 \(i\) 的位置填入了大于 \(i\) 的数,则k+=i

  4. 若将 \(i\) 填到了下标大于 \(i\) 的位置,下标 \(i\) 的位置填入了小于 \(i\) 的数,则k+=i

  5. 若将 \(i\) 填到了下标大于 \(i\) 的位置,下标 \(i\) 的位置填入了大于 \(i\) 的数,则j++

其中1、3、4是可以合并的,添加方案数就为2*j+1

然后最后答案为\(\sum_{x\geq K} f[n][0][x]\)

其实你在转移的时候把大于 \(K\) 的都加在 \(K\) 里,就不用再求和了。

代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=50+10;
const int Mod=998244353;
int n,K;
long long ans;
int f[maxn][maxn][maxn*maxn]; int main(){
#ifndef LOCAL
freopen("D.in","r",stdin);
freopen("D.out","w",stdout);
#endif
scanf("%d%d",&n,&K);
f[0][0][0]=1;
for(int i=1;i<=n;i++)
for(int j=0;j<=i;j++)
for(int k=0;k<=K;k++){
long long G=f[i-1][j][k];
f[i][j][min(k+i,K)]=(f[i][j][min(k+i,K)]+(2*j+1)*G%Mod)%Mod;//1&3&4
f[i][j+1][k]=(f[i][j+1][k]+G);//5
if(j)f[i][j-1][min(k+2*i,K)]=(f[i][j-1][min(k+2*i,K)]+j*j*G%Mod)%Mod;//2
}
ans=f[n][0][K];
for(int i=2;i<=n;i++)
ans=ans*i%Mod;
printf("%lld\n",ans);
return 0;
}

【动态规划】DP搬运工3的更多相关文章

  1. 动态规划dp

    一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...

  2. 算法-动态规划DP小记

    算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...

  3. 水题大战Vol.3 B. DP搬运工2

    水题大战Vol.3 B. DP搬运工2 题目描述 给你\(n,K\),求有多少个\(1\)到\(n\) 的排列,恰好有\(K\)个数\(i\) 满足\(a_{i-1},a_{i+1}\) 都小于\(a ...

  4. 非确定性有穷状态决策自动机练习题Vol.3 D. Dp搬运工3

    非确定性有穷状态决策自动机练习题Vol.3 D. Dp搬运工3 题目描述 给定两个长度为 \(n\) 的排列,定义 \(magic(A,B)=∑_{i=1}^nmax(Ai,Bi)\) . 现在给定 ...

  5. DP搬运工1 [来自yyy--mengbier的预设型dp]

    DP搬运工1 题目描述 给你 \(n,K\) ,求有多少个 \(1\) 到 \(n\) 的排列,满足相邻两个数的 \(max\) 的和不超过 \(K\). 输入格式 一行两个整数 \(n,K\). 输 ...

  6. 【转】动态规划DP

    [数据结构与算法] DP 动态规划 介绍 原创 2017年02月13日 00:42:51 最近在看算法导论. DP全称是dynamic programming,这里programming不是编程,是一 ...

  7. 动态规划DP的优化

    写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...

  8. hdu 1421:搬寝室(动态规划 DP + 排序)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. hdu 2059:龟兔赛跑(动态规划 DP)

    龟兔赛跑 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

随机推荐

  1. Vue 下拉刷新及无限加载组件

    原文  https://github.com/wangdahoo/vue-scroller 主题 Vue.js Vue Scroller Vue Scroller is a foundational ...

  2. 阿里出品Excel工具EasyExcel使用小结

    前提 笔者做小数据和零号提数工具人已经有一段时间,服务的对象是运营和商务的大佬,一般要求导出的数据是Excel文件,考虑到初创团队机器资源十分有限的前提下,选用了阿里出品的Excel工具EasyExc ...

  3. oracle之二redo日志

    redo 日志 4.1 redo (重做) log 的功能:数据recovery4.2 redo log 特征:     1)记录数据库的变化(DML.DDL)     2)用于数据块的recover ...

  4. 单链表的前K个的逆序输出

    单链表逆序输出也是常被面试官问到题算法题,所以自己就总结了一下,在此贴出算法,与小伙伴们相互交流. 首先要有三个指针,前两个分别指向首节点,首节点的下一个节点,第三个是临时指针,是为了储存首节点的下一 ...

  5. shell变量操作${}详细用法

    ${}基本功能 一般情况下$var与${var}是没有区别的,但是用${ }会比较精确的界定变量名称的范围 [root@localhost ~]# A=Linux [root@localhost ~] ...

  6. react项目结合echarts,百度地图实现热力图

    一.最近在一个react项目(antd pro)中需要展示一个热力地图.需求是: 1.热力地图可缩放: 2.鼠标点击可以展示该点地理坐标,及热力值. 3.初始化时候自适应展示所有的热力点. 4.展示热 ...

  7. treemap使用了解

    参考了https://www.jianshu.com/p/d9ad7f6d75a0 https://www.zhuxiaodong.net/2018/collection-in-java-treema ...

  8. 30种SQL语句优化

    1.'对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用 ...

  9. MySQL中的find_in_set()函数使用技巧心得与应用场景总结

    Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,CSDN官方首发原创文章 企业博客 CSDN.com 个人博 ...

  10. 记录jmeter使用beanshell断言获取复杂的json字符串参数值

    实战示例 测试场景 电商系统经常会涉及到商品的库存数量的压测,在用户下单前需要先做库存余量的判断,当余量不足时用户无法下单,保证商品的有效售卖 库存余量查询响应结果 响应结果一般是json字符串的形式 ...