2023牛客暑期多校-J-Qu‘est-ce Que C‘est?(DP)

题意:

给定长度为n的数列,要求每个数都在的范围,且任意长度大于等于2的区间和都大于等于0,问方案数。

思路:

首先要看出是dp题,用来表示遍历到第i位且后缀和最小为x 的可行方案数(此时的后缀可以只有最后一位)。很显然j的值在区间。下面考虑dp如何转换:

1.对于。 先讨论可由加一位值为 转换而来;也可由加一位值为0 转换而来。就有。再讨论,可由,加一位值为 转换而来;也可由 加一位值为1转换而来。就有。依次讨论可以得出可以由,末位加值为转换而来;也可由,末位加x转换而来。综上所诉:

2.对于。可以去验证,只有,末位加值为x 才能转换成。所以

为了方便计算我们把这个区间平移映射到区间上。按照上述思想去找新的dp转换式就有:

由于都是求和到2m,所以可以考虑后缀和优化。

代码:

复制代码
//#define _CRT_SECURE_NO_WARNINGS 
//#include<iostream>
//#include<algorithm>
//#include<cstdio>
//#include<map>
//#include<string.h>
//#include<string>
//#include<vector>
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 998244353;
const int N = 5005;
ll dp[N][N*2];//dp[i][j]表示遍历到i位,后缀和最小为j且合法的数量。(这里后缀和包含了只含有最后一位的情况)
ll sum[N * 2];//后缀数组
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, m;
	cin >> n >> m;
	ll ans = 0;
	//初始化
	for (int i = 0; i <= m*2; i++)
	{
		dp[1][i] = 1;
	}
	for (int i = 2; i <= n; i++)
	{
		//处理后缀和
		for (int j = m * 2; j >= 0; j--)sum[j] = (sum[j + 1] + dp[i - 1][j]) % mod;
		//[0,m)的情况
		for (int j = 0; j < m; j++)
		{
			dp[i][j] = sum[2 * m - j];
		}
		//[m,2m]的情况
		for (int j = m; j <= 2 * m; j++)
		{
			dp[i][j] = sum[j - m];
		}
	}
	//统计
	for (int i = 0; i <= m * 2; i++)
	{
		ans = (ans + dp[n][i]) % mod;
	}
	cout << ans << endl;
	return 0;
}
相关推荐
知识浅谈1 小时前
DeepSeek V4 和 GPT-5.5 在同一天发布了??我也很懵,但对比完我悟了
算法
DeepModel1 小时前
通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
人工智能·学习·算法·机器学习
田梓燊1 小时前
力扣:19.删除链表的倒数第 N 个结点
算法·leetcode·链表
handler012 小时前
从零实现自动化构建:Linux Makefile 完全指南
linux·c++·笔记·学习·自动化
简简单单做算法3 小时前
基于GA遗传优化双BP神经网络的时间序列预测算法matlab仿真
神经网络·算法·matlab·时间序列预测·双bp神经网络
guygg883 小时前
利用遗传算法解决列车优化运行问题的MATLAB实现
开发语言·算法·matlab
武藤一雄3 小时前
19个核心算法(C#版)
数据结构·windows·算法·c#·排序算法·.net·.netcore
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章52-交点查找
图像处理·人工智能·opencv·算法·计算机视觉
我头发多我先学4 小时前
C++ 模板全解:从泛型编程初阶到特化、分离编译进阶
java·开发语言·c++
yu85939584 小时前
MATLAB连续线性化模型预测控制(SL-MPC)
算法·机器学习·matlab