P4933 大师

举报
辰chen 发表于 2022/06/15 01:13:30 2022/06/15
【摘要】 P4933 大师 P4933 大师AC代码 P4933 大师 本题链接:P4933 大师 本博客给出本题截图: AC代码 代码解释: f[i][j]代表的是在以第 i 项结尾...

P4933 大师


P4933 大师

本题链接:P4933 大师

本博客给出本题截图
在这里插入图片描述
在这里插入图片描述

AC代码

代码解释
f[i][j]代表的是在以第 i 项结尾,公差为 j 的所有等差数列的数量,在这里我们可以知道,如果我们 j 按照从 1 ~ M 来暴力枚举,显然会 TLE 思考后会发现,我们如果只去枚举 h[i] - h[j] 即可,因为可能会有负数:递减的等差数列,故可能会有 h[i] - h[j] < 0,这里我们把数组开成两倍之后用 h[i] - h[j] + M / 2 即可
这里提一下状态转移方程:

f[i][t] = (f[i][t] + f[j][t] + 1) % mol;

  
 
  • 1

这里为什么要 + 1,可以理解成 在所有的以 j 结尾的数列多加一个 i ,再加上单独由 j 和 i 组成的这么一组数列
注意 dp 过程中我们不讨论只有一个电塔的情况,故我们的 res 初始化为 n

代码

#include <cstdio>
#include <algorithm>

using namespace std;

#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1010, mol = 998244353, M = 40010;

int h[N];
int f[N][M];
int n;

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++ ) scanf("%d", &h[i]);
	
	int res = n;
	for (int i = 1; i <= n; i ++ ) 
	{
		for (int j = i - 1; j; j -- )
		{
			auto t = h[i] - h[j] + M / 2;
			f[i][t] = (f[i][t] + f[j][t] + 1) % mol;
			res = (res + f[j][t] + 1) % mol;
		}
	}
	
	printf("%d\n", res);
	
	return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

文章来源: chen-ac.blog.csdn.net,作者:辰chen,版权归原作者所有,如需转载,请联系作者。

原文链接:chen-ac.blog.csdn.net/article/details/119842571

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。