首页 > 其他分享 >P4933 大师

P4933 大师

时间:2023-11-14 18:00:36浏览次数:25  
标签:minH int ll operatorname 公差 P4933 复杂度 大师

P4933 大师

基础思路

  • 状态设置

    • \(F_{k,i}\) 表示公差为 \(k\) 前 \(i\) 个电塔的等差数列数。
    • 两个 \(F\) 一个公差为 \(k\),一个为 \(-k\)。
  • 状态转移

    • 对于\(F_{k, i}\),从所有在 \(i\) 之前的的与第 \(i\) 个电塔差为 \(j\) 的 \(F\) 方案加一转移而来。

    • 	for (int k = 0; k <= D; k++)
      	{
      		for (int i = 1; i <= n; i++)
      		{
      			for (int j = 1; j < i; j++)
      			{
      				if (h[i] - h[j] == k)
      				{
      					dp1[k][i] += dp1[k][j] + 1;
      					dp1[k][i] = dp1[k][i] mod;
      				}
      				if (h[i] - h[j] == -k)
      				{
      					dp2[k][i] += dp2[k][j] + 1;
      					dp2[k][i] = dp2[k][i] mod;
      				}
      			}
      			if(k != 0)
      				ans += dp1[k][i] + dp2[k][i], ans = ans mod;
      			else
      				ans += dp1[k][i], ans = ans mod;
      		}
      	}
      

然而只有65pts,毕竟接近 \(\operatorname {O}(n^3)\) 的复杂度。

改进思路

我们可以把这个算法简化为,枚举一个公差 \(k\),然后统计有多少个公差为 \(k\) 的等差数列。

枚举公差的时间复杂度是 \(\operatorname{O}(v)\),观察数据范围可以猜测,统计的时间复杂度是,\(\operatorname{O}(n)\),总复杂度是\(\operatorname{O}(n\times v)\)。

回顾 \(65\) 分的那个的 \(DP\),用到这个统计上来,用 \(F_{k,i}\) 表示以 \(i\) 结尾的,公差为 \(k\) 的等差数列有多少个,转移的时候枚举一个小于 \(i\) 的 \(j\) ,然后当 \(h_j = h_i - k\) 时候从 \(F_{k, j}\) 转移到 \(F_{k, i}\)。

状态已经不可能再简化了,但是转移可以。

我们发现,转移相当于一个求和,对小于 \(i\) 的所有高度等于\(h_i - k\) 的位置的 \(DP\) 值求和。

我们可以维护一个数组 \(G\) 来记录这个和,这样转移就只有两行了。

\[F_{k, i} = G_{h_i - k} \]

\[G_{h_i} = G_{h_i} + F_{k, i} \]

总复杂度是\(\operatorname{O}(n\times v)\)

AC代码

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

#define mod %998244353
#define ll long long

using namespace std;

const int N = 1e3 + 10;
const int M = 2e4 + 10;

int n;
int h[N];
ll dp1[M][N];
ll dp2[M][N]; 
ll G1[M];
ll G2[M];
ll ans = 0;
int D = 0, minH = 0x7fffffff, maxH = 0;

int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> h[i];
		
		minH = min(minH, h[i]);
		maxH = max(maxH, h[i]);
	}
	
	D = maxH - minH;
	
	for (int k = 0; k <= D; k++)
	{
		memset(G1, 0, sizeof(G1));
		memset(G2, 0, sizeof(G2));
		for (int i = 1; i <= n; i++)
		{
			
			if (h[i] - k >= minH)
				dp1[k][i] = G1[h[i] - k];
			if (h[i] + k <= maxH && k)
				dp2[k][i] = G2[h[i] + k];
			G1[h[i]] += dp1[k][i] mod + 1, G1[h[i]] mod;
			G2[h[i]] += dp2[k][i] mod + 1, G2[h[i]] mod;
			ans += (dp1[k][i] mod + dp2[k][i] mod ) mod, ans mod;
		}
	}
	cout << (ans + n) mod;
	return 0;
}

实现上还有有一定难度的

  • 正确理解 \(G\) 数组的作用,无论是否能更新 \(dp1\) 都要更新 \(G\) 数组。
    • 因为该数组要记录在 \(i\) 之前的和,如果后面要用到,前面没更新就是错的。
  • 取模。
    • ans 和所有有关动规的数组都要开 long long 而且每一步都要取模。

标签:minH,int,ll,operatorname,公差,P4933,复杂度,大师
From: https://www.cnblogs.com/kdlyh/p/17832201.html

相关文章

  • 大师学SwiftUI第9章Part 1 - 异步并发之Task、Async、Await和错误
    其它相关内容请见虚拟现实(VR)/增强现实(AR)&visionOS开发学习笔记苹果系统借助现代处理器的多核可同步执行多条代码,提升同一时间内程序所能执行的任务。例如,一段代码从网上下载文件,另一段代码可以在屏幕上显示进度。此时,我们不能等待第一个执行完后再执行第二个,而必须要同步执行这......
  • PG游戏库大师的选择?分析师透露明年iPad全新6款机型,史上最大屏iPad Air领衔
    苹果今年罕见未发布任何新平板,引起PGSOFT科技电子外界对2024年iPad系列的高度关注。最新消息透露,明年上半年至下半年将陆续推出四大新系列,包括入门iPad、iPadmini、高阶iPadAir和旗舰iPadPro,共6款机型。除了芯片性能升级外,高阶iPadPro将进行屏幕面板升级,或带来一波价格涨幅。分......
  • 从零构建以太坊智能合约到项目实战:掌握区块链编程的精髓 成为区块链编程大师
    从零构建以太坊智能合约到项目实战:掌握区块链编程的精髓成为区块链编程大师为什么说现在学习区块链才是最好的时机?区块链技术不只是能开发数字货币,不只是能进行ICO。当我分享一些区块链文章的时候,偶尔总会有人艾特我说,春哥,现在国家都不让炒币了,还弄个毛的区块链啊。我一般会......
  • Adobe“大师版”和“SP版”的含义和区别,如何选择?
    首先要说明的是大师版和SP版,它们所包含的软件版本和功能完全相同,只是封装的方式不同,安装方法也相同,都是一键式安装,不需要激活,永久使用。要说不同,那就是大师版“体积大(以2022Winx64大师版为例:大小约为26G)”,SP版“体积小”。相对来说,SP版更新更快、更全一些,大师版更新慢些。什么是......
  • 草图大师(SketchUp)2022安装图文教程
    草图大师(SketchUp)是一个非常受欢迎并且易于使用的3D设计软件,它被比喻为电子设计中的“铅笔”。它的主要特点就是使用简便,人人都可以快速上手。并且可以将使用SketchUp创建的3D模型直接输出至GoogleEarth里。下载草图大师2022版并解压缩【rjqjf.com】二、双击进入解压缩后的“草图......
  • React 大师版
    第一部分一、todoList案例相关知识点 1.拆分组件、实现静态组件,注意:className、style的写法 2.动态初始化列表,如何确定将数据放在哪个组件的state中? ——某个组件使用:放在其自身的state中 ——某些组件使用:放在他们共同的父组件state中(官方称此操作为:状态提升) 3.关于......
  • SketchUp草图大师2022中文版下载 安装包下载方式
    草图大师sketchup官方电脑版是一款设计方案创作过程的设计工具,草图大师已经成为全球数百万设计师选择的设计工具。很多型号质量都很好。支持视频动画功能,让设计师在软件中全方位释放创意。创建三维建筑设计方案的优秀工具。有需要的朋友不妨下载试试。软件地址:看置顶贴部分软件使......
  • sketchup草图大师官方电脑版 安装包下载方式
    SketchUp2020是一款非常优秀的三维3D建模软件,新版本更加强大好用,功能更加丰富,为用户提供绘图工具、建模渲染、扩展插件和渲染器模板、海量3D模型库及建模灯光材质渲染效果图等等,提高用户的工作效率。软件支持中文哦。软件地址:看置顶贴安装步骤1、在本站下载最新版的草图大师(Sketch......
  • SketchUp草图大师2022中文版下载 安装包下载方式
    草图大师sketchup官方电脑版是一款设计方案创作过程的设计工具,草图大师已经成为全球数百万设计师选择的设计工具。很多型号质量都很好。支持视频动画功能,让设计师在软件中全方位释放创意。创建三维建筑设计方案的优秀工具。有需要的朋友不妨下载试试。软件地址:看置顶贴部分软件使用......
  • Kotlin-大师班 第五章-随笔
    数组Array1.基础数据类型Array 2.arrayOf:基础类型、字符串、自定义类对象,甚至类,甚至不同类型放在这一个数组里。 3.不可变集合三兄弟,除了他们仨后面的都可变。 4.可变集合ArrayList,arrayListOf,mutabalListOfmutableSetOf,hashSetOfHashMap,hashMapOf,mutableMa......