DP搬运工1

题目描述

给你 \(n,K\) ,求有多少个 \(1\) 到 \(n\) 的排列,满足相邻两个数的 \(max\) 的和不超过 \(K\)。

输入格式

一行两个整数 \(n,K\)。

输出格式

一行一个整数 \(ans\) 表示答案 \(mod\ 998244353\)。

样例

样例输入 1

4 10

样例输出 1

16

样例输入 2

10 66

样例输出 2

1983744

数据范围与提示

有 \(50\) 个测试点,第 \(i\) 个测试点为 \(n=i\),\(K \leqslant n^2\) 。

分析

用学长的题解来说这个叫做预设性 \(dp\) (其实也不知道啥意思)。意思大概就是枚举的是当前放哪个数(因为这几个题貌似都是这样)。

这个题我们考虑往里边插入数,因为每一次要取 \(max\) ,所以我们根据当前插入的值两边还可不可以放数来进行转移。

如果可以放入一个数,那么当前这个数之对和贡献一次。

如果两边可以放入两个数,那么这个数是没有贡献的。

如果两边都不放数,那么它贡献两次。

所以我们定义 \(f[i][j][k]\) 为放到第 \(i\) 个数,可以放的位置有 \(j\) 个。和为 \(k\)。

因为可以放在序列中,也可以放在两端,所以我们分开来考虑。

放在两端的时候就没有两边放两个数的情况了,但是两端有两种情况,所以加的时侯 \(f[i-1][j][k]\) 需要乘以 \(2\) 。

放在中间就需要考虑了,但是只有在当前数两边放一个的时候才用乘以 \(2\) ,所以我们就可以愉快的转移了。

代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
//以下好多行是卡常
const int L=1<<20;
char buffer[L],*S,*T;
#define lowbit(x) (x & -x)
#define getchar() (S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T)?EOF:*S++)
#define inline __inline__ __attribute__((__always_inline__))
#define max(a,b) (a>b?a:b)
#define re register
const int maxn = 52;
const int mod = 998244353;
int f[maxn][maxn][maxn*maxn];
int n;
inline int read(){
int s = 0,f = 1;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-')f = -1;
ch = getchar();
}
while(isdigit(ch)){
s = s * 10 + ch - '0';
ch = getchar();
}
return s * f;
}
int main(){
n = read();
int K = read();
f[1][0][0] = 1;
for(int i = 2;i <= n;++i){
int jl1 = min(i,n-i)+1; //找到当前最多有多少位置能放
int jl2 = min(K,i*i);//找到当前最大的和
for(int j = 0;j <= jl1; ++j){
for(int k = 0;k <= jl2; ++k){
if(!f[i-1][j][k])continue;
int jl = f[i-1][j][k] * 2 % mod;//第一种放在两端的情况
f[i][j+1][k] = (f[i][j+1][k] + jl) % mod;
f[i][j][k+i] = (f[i][j][k+i] + jl) % mod;
if(!j)continue;
jl = f[i-1][j][k] * 1ll * j % mod;//以下是放在序列中间的情况
f[i][j+1][k] = (f[i][j+1][k] + jl) % mod;
f[i][j][k+i] = (f[i][j][k+i] + jl * 2ll % mod) % mod;
f[i][j-1][k+2*i] = (f[i][j-1][k+2*i] + jl) % mod;
}
}
}
int ans = 0;
for(int i = 0;i <= K;++i){//把小于等于 K 的所有情况都加起来
ans = (ans + f[n][0][i]) % mod;
}
printf("%d\n",ans);
}

DP搬运工1 [来自yyy--mengbier的预设型dp]的更多相关文章

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

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

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

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

  3. 【题解】Luogu p2986 [USACO10MAR]伟大的奶牛聚集Great Cow Gat 树型dp

    题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of cours ...

  4. 区间型DP

    区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...

  5. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  6. POJ_1088 滑雪(记忆型DP+DFS)

    Description Michael喜欢滑雪,这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

  7. UVA12186--树型DP

    树型DP第一题...就是从boss到底层员工是一个树型结构,底层员工想加薪,如果每个boss都有超过T%的员工要求加薪,他就会往更高的bOSs传达,问如果让根节点的大boss接到加薪要求,最少要有多少 ...

  8. POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断

    好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...

  9. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

随机推荐

  1. 【论文笔记】Self-Supervised GAN :辅助性旋转损失的自监督生成式对抗网络

    这是CVPR2019上UCLA和google brain的一个工作.模型非常简单,利用辅助损失解决GAN不稳定问题:用旋转分类将辅助分类器对label的需求去掉,使图片可以直接对自己标注类别. Sel ...

  2. C#中子类对基类方法的继承、重写和隐藏

    提起子类.基类和方法继承这些概念,肯定大家都非常熟悉.毕竟,作为一门支持OOP的语言,掌握子类.基类是学习C#的基础.不过,这些概念虽然简单,但是也有一些初学者可能会遇到的坑,我们一起看看吧.   子 ...

  3. jupyter的服务器配置安装

    该教程主要针对的是服务器安装,且在后台保持稳定运行的情况. 1.jupyter下载 有网的时候 1. pip install jupyter 离线安装 在有网络的环境下载安装包 2. pip down ...

  4. 解决SyntaxError: Non-UTF-8 code starting with '\xbb'问题

    在第一行加入 # coding=utf-8 2020-06-13

  5. Tkinter常用简单操作

        截图来自北京尚学堂 手册:http://effbot.org/tkinterbook/ 2020-04-20

  6. python基础day7_购物车实例

    print("欢迎光临") money = input("请输入您的金额:") shopping_car ={} li = [{"name" ...

  7. Python自动化运维 技术与最佳实践PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书

    点击获取提取码:7bl4 一.内容简介 <python自动化运维:技术与最佳实践>一书在中国运维领域将有"划时代"的重要意义:一方面,这是国内第一本从纵.深和实践角度探 ...

  8. python 创建字典以及操作字典----这是基础知识

    当你编程久了,发现所有的东西都是建立在基础之上的,庞大的代码 你要识别出它的类型是什么 或者返回后类型是什么!? 根据返回的类型 或者需要操作的对象是什么类型  就可以选择相应的方法进行处理 #创建字 ...

  9. Access to XMLHttpRequest at xxxx from origin ‘null‘ has been blocked by CORS policy:

    使用前后端分离的方式创建web项目的时候出现问题: 这是因为 ajax 请求的对应的域在本地的一个文件路径,比如在D盘的某个文件夹,这里存放的都是前端文件: 但是对应的服务器是 localhost 的 ...

  10. JVM与Java体系结构

    参考笔记:https://blog.csdn.net/weixin_45759791/article/details/107322503 前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问 ...