牛客IOI周赛23-普及组 /D(序列dp)

经典DP问题过河卒代码 经典过河卒:A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。 立即下载

牛客IOI周赛23-普及组 /D(序列dp)

题目

题面:
小L喜欢数和数列。小L称a1…ana_1…a_na1​…an​这些数为优秀的。小L称一个序列b1…bmb_1…b_mb1​…bm​为好的当且仅当:
1.对于任意的 i(1≤i<m)i (1 \leq i <m)i(1≤i<m),满足 bi<bi+1b_i<b_{i+1}bi​<bi+1​。
2.对于任意的 i(1≤i<m)i (1 \leq i <m)i(1≤i<m),满足 gcd(bi,bi+1)>1gcd(b_i,b_{i+1})>1gcd(bi​,bi+1​)>1。其中,gcd(x,y)gcd(x,y)gcd(x,y) 为 xxx 和 yyy 的最大公因数,即最大的 ddd,满足:d∣xd|xd∣x且d∣yd|yd∣y。
3.对于任意的 i(1≤i≤m)i (1 \leq i \leq m)i(1≤i≤m),bib_ibi​这个数是优秀的。
现在,小L想知道最长的能称为好的的序列的长度是多少,容易证明这个长度是有穷的。

显然这是一个序列dp的问题:
先将序列从小到大排序,用 d p [ i ] dp[i] dp[i]前 i i i位合法序列的最大长度,
那么有转态转移方程。
d p [ i ] = max ⁡ j < i , g c d ( a [ i ] , a [ j ] ) ! = 1 ( d p [ i ] , d p [ j ] + 1 ) dp[i]=\max_{j<i,gcd(a[i],a[j])!=1}(dp[i],dp[j]+1) dp[i]=j<i,gcd(a[i],a[j])!=1max​(dp[i],dp[j]+1)
时间复杂度为 O ( n 2 ) O(n^2) O(n2)。

现考虑优化dp过程,原dp转移过程中需要枚举所有 j < i j<i j<i的项且要求解 g c d ( a [ i ] , a [ j ] ) gcd(a[i],a[j]) gcd(a[i],a[j])。
可以考虑枚举 a [ i ] a[i] a[i]的质因子,用 l e n [ p ] len[p] len[p]表示包含素因子 p p p的 a [ i ] a[i] a[i]中能组成合法序列的最大长度。
那么状态转移方程变化为:
d p [ i ] = max ⁡ p ∣ a [ i ] ( d p [ i ] , l e n [ p ] + 1 ) dp[i]=\max_{p|a[i]}(dp[i],len[p]+1) dp[i]=p∣a[i]max​(dp[i],len[p]+1) p p p是 a [ i ] a[i] a[i]的素因子。
在更新完 d p [ i ] dp[i] dp[i]后,我们需要更新 a [ i ] a[i] a[i]所有素因子对应的 l e n [ i ] len[i] len[i],即
l e n [ p ] = max ⁡ p ∣ a [ i ] ( l e n [ p ] , d p [ i ] ) len[p]=\max_{p|a[i]}(len[p],dp[i]) len[p]=p∣a[i]max​(len[p],dp[i])

#include<bits/stdc++.h>
using namespace std;
const int max_n=1e6+5;
int dp[max_n];
int prime[max_n];
int vis[max_n];
int a[max_n];
int n;
int cnt=0;
vector<int> f;
void init(void)
{
	for(int i=2;i<max_n;i++)
	{
		if(!vis[i])prime[cnt++]=i;
		for(int j=0;j<cnt&&i*prime[j]<max_n;j++)
		{
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)break;
		}
	}
}
int main(void)
{
	int t;
	init();
	scanf("%d",&t);
	while(t--)
	{
		int ans=0;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		sort(a+1,a+n+1); 
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)
		{
			f.clear();
			int anss=-1;
			for(int j=0;j<cnt&&prime[j]*prime[j]<=a[i];j++)
			if(a[i]%prime[j]==0){
				while(a[i]%prime[j]==0)a[i]/=prime[j];
				anss=max(anss,dp[prime[j]]+1);
				f.push_back(prime[j]);
				if(a[i]==1)break;
			}
			if(a[i]!=1){
				anss=max(anss,++dp[a[i]]);
				f.push_back(a[i]);
			}
			ans=max(anss,ans);
			for(int k=0;k<f.size();k++)
			dp[f[k]]=max(dp[f[k]],anss);
		}
		cout<<ans<<endl;
	}
}
Creo二次开发环境配置与DLL项目实战指南(Creo8.0+VS2019) 本文详细介绍了Creo8.0与VS2019环境下的二次开发配置与DLL项目实战指南,涵盖环境准备、版本匹配、DLL项目创建、核心代码编写、部署调试及常见报错处理。重点解析了Creo二次开发中的关键配置和优化技巧,帮助开发者高效解决实际问题。 阅读详情

相关推荐

别再死磕NFP了!用Python+遗传算法搞定异形件自动排版(附完整代码)

本文介绍了如何利用Python和遗传算法实现异形件智能排版,解决传统NFP方法计算复杂的问题。通过Shapely库处理几何运算和DEAP库搭建遗传算法框架,结合模拟退火策略避免局部最优,显著提升材料利用率。附完整代码和优化技巧,适用于服装裁剪、金属加工等行业。

weixin_26965807的博客 235

序列 dp

时间:2021/2/22 测试练习 题目:(蓝桥杯 基础练习) 视频学习 视频名称:蓝桥杯训练营(C++) 12.3-常见动态规划模型 学习记录 最大子段和 ​ 对于全是非正数的序列,答案是其中元素的最大值 ​ 对于有正数的序列,考虑以每一个点位结尾的最大子段和,这个子段一定满足其前缀和均非负,因为如果有一个前缀是负的,那么减掉这个前缀对于这个点一定更优,并且这个子段要尽量往前延伸 最长上升子序列 (Longest Increasing Subsequence) 对应练习 最大

weixin_55071946的博客 470

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

【专题讲解】序列DP

文章目录LIS最长递增子序列的长度最长递增子序列的个数354. 俄罗斯套娃信封问题编辑距离打家劫舍类740. 删除并获得点数446. 等差数列划分 II - 子序列 什么是序列DP 序列dp是一类最长,最多的子序列的相关问题。 状态转移方程中 dp[i] 表示前i个元素a [0],a [1],…a [i-1]的某种性质, 坐标型 dp 状态转移方程中f [i]表示以元素a [i]结尾的某种性质。 LIS 最长递增子序列的长度 最长递增子序列的个数 class Solution { public

遍地跑小鸡的博客 1358

stm32f103c8t6+esp8266在WiFi下通过手机控制外设

stm32f103c8t6+esp8266在WiFi下通过手机控制外设前言 前言 通过上一篇,介绍了esp8266的基本功能,这篇将用stm32c8t6配合esp8266进行数据交互,实现用手机通过无线的方式去控制外设、开关等;这里相当于把stm32作为上一篇的串口助手和esp8266进行通信; ...

weixin_45430735的博客 1万+

PCL 八叉树的使用

八叉树(Octree)是一种空间划分的数据结构,广泛应用于三维点云的处理和分析。八叉树通过将空间递归地划分为八个子区域,可以有效地组织和索引三维点数据,提升点云的查询、降采样和配准等操作的效率。

纵马踏花向自由 1658

序列DP总结 (子序列问题,编辑距离,回文子串)

DP问题没见过很难理解,但是模型也很多,写题的时候可以多套用之前模型的思路。这里结合AcWing闫总跟代码随想录卡哥的思想去理解序列DP。

qq_61597023的博客 673

CAPL未来发展方向展望

通过本文的学习,读者应该对CAPL的未来发展方向有了初步的了解。随着汽车电子系统的不断发展,CAPL也在不断演进,以支持更多的技术和应用场景。希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1182

序列dp基础模型

例如,若X=和Y=,则序列是X和Y的一个公共子序列,序列 也是X和Y的一个公共子序列。我们称序列Z=�=是序列X=�=的子序列当且仅当存在严格上升的序列,使得对j=1,2,...,k,有xij=zj���=��。

Li的博客 670

JavaScript - Blob / File / base64 使用场景介绍与相互转换

前言 本文首先介绍一下这三种对象使用场景,最后介绍下它们之间互转格式的解决方案。 您前端一旦涉及到文件或图片上传到服务器, 就势必离不了Blob/File/base64三种主流的类型。 Blob MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/Blob 您可以观察到,像一些图片处理插件(例如有名的vue-cropper)图片裁剪插件, 它们将图片处理完毕后,都将使用blob对象返回处理好的图片,供开发者用于上传服务器。

🏆 前端领域优质创作者 4493

RT-DETR改进策略【模型轻量化】| 替换骨干网络为 GhostNet V3 2024华为的重参数轻量化模型

本文记录的是基于 GhostNetV3 的 RT-DETR轻量化改进方法研究。GhostNetV3的轻量模块采用方法,训练时为深度可分离卷积和1×1卷积添加,推理时通过移除分支、折叠操作,能够在不增加推理成本的同时提高性能,从而实现RT-DETR的轻量化改进。

Limiiiing的博客 971

序列 DP

序列 DP

yake1965 815

Nmap源码分析(端口扫描)

端口扫描是Nmap的核心功能,用于确定目标机的端口状态(开放、关闭、过滤等),也为Nmap的服务与版本扫描、OS扫描、脚本扫描提供基本的指引信息。所以,深入理解端口扫描的实现对分析其他的扫描方式很有帮助。 1简单回顾   首先简要回顾一下端口扫描的原理以及命令行选项。 1.1扫描原理   Nmap提供的10多种类型的端口扫描方法,如TCP SYN/ACK/FIN/Xmas/NULL/ Windows/Connect,FTP Bounce, Idle scan, UDP port u...

墨痕诉清风的博客 1597

牛客IOI周赛23-普及组 D.小L的数列【DP | 质因数分解优化】

题意: 给定 n 个数,定义好的序列满足如下两个条件:(1)严格递增;(2)对于相邻的两个数,它们的 gcd > 1。求最长的好的序列。 2≤n≤1000002 ≤ n ≤ 1000002≤n≤100000,1≤ai≤1000001 ≤ a_i ≤ 1000001≤ai​≤100000 且 aia_iai​ 两两不相同,1≤T≤51 ≤ T ≤ 51≤T≤5。 思路: 80分思路:首先排序,令 dp[i] 为以 i 结尾的最长好序列,不难得出状态转移方程为 dp[i]=max⁡0≤j<i

weixin_44258590的博客 358

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

牛客IOI周赛23-普及组 D.小L的数列 (dp状态+枚举因子)

原题链接 思路: 看到这题第一眼觉得要用些数论的知识优化,决定先写个暴力。 假设dp[i]表示枚举到第i项的时候最长的好的序列长度,转移仿照LIS的n^2转移,过了80。 然后就不会优化了。 宇巨说可以枚举因子进行优化: ///dp[i]表示以数i为结尾的最长的好的序列长度 ///dp1[i]表示因数包括i的数结尾的最长好的序列长度 这样转移的时候将第二层for改成sqrt(n)的复杂度,并且在过程中用dp1更新dp,枚举完因子后,再用此数的dp更新因子的dp1。 事实证明,dp的状态选择多么重要(逃 代

我们都有光明的未来 2833

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

牛客IOI周赛23-普及组 D题 - LIS变形

很容易看出,将原数组从小到大排序,就可以按照LIS的DP套路来解这道题了。但是,一般情况下LIS是O(n^2),用在这道题会被卡。LIS可以优化做到O(nlogn),参照LIS的优化也是有可能解出这道题的,但比赛时一直想不出来。看了他人的题解后才明白的。 首先是dp状态的定义: dp[i]: 表示以数字i为结尾的最长好序列的长度。注意,这里是指以i为结尾,而不是以b[i]为结尾(b[0 ~ n - 1]为原数组)。 转移方程: dp[i] = max(dp[j]) + 1 for j < i

shamansi99的博客 221

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【导览】知识点清单

【洛谷】P1060 [NOIP 2006 普及组] 开心的金明。【洛谷】P1048 [NOIP 2005 普及组] 采药。

写代码的犄角旮瘩 2230

序列DP | 最长递增子序列

首先一定要分清楚 子串 与 子序列 的概念:两者都是从某一序列种从左向右找出一定元素组成的,但子串是一定要连续的,而子序列不需要。例如:串 abcde 的字串可以为 abc、cde 等,子序列可以为 abc、ade、ace 。 最长递增子序列问题(LIS):给定一个有 n 个元素的序列 a[ ],求出其递增子序列的最大长度。 短短的题目透露出了很大的恶意啊...这个问题我想了很久,也参...

weixin_43787043的博客 430

【LeetCode】动态规划 | 线性DP 序列DP(子序列)

博文声明:仅供本人学习交流使用,相关代码和资料已留下引用出处。 公共子序列 子序列定义:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 可以不连续 【参考:【你的衣服我扒了 - 《最长公共子序列》】动态规划 - 不相交的线 - 力扣(LeetCode)】 一般这种求解 两个数组或者字符串 求最大或者最小 的题目都可以考虑动态规划,并且通常都定义 dp[i][j] 为 以 A[i], B[j] 结尾的 xxx 718. 最长重复子数组 1143..

myaijarvis notebook 969

算法之动态规划总结(11种DP类型,70道全部搞懂)

简介 参考文章,将所有的DP问题分成11大类,本文将这些题目的解法进行探讨。所有题目均来自leetcode。 题目 1、线性 DP 最经典单串: 最长上升子序列 最经典双串: 最长公共子序列 经典问题: 三角形最小路径和 最大子序和 乘积最大子数组 鸡蛋掉落(DP+二分) 俄罗斯套娃信封问题 打家劫舍系列: (打家劫舍3 是树形DP) 打家劫舍 打家劫舍 II 股票系列: 买卖股票的最佳时机 买卖股票的最佳时机 II 买卖股票的最佳时机 III 买卖股票的最佳时机 IV

pl0321的博客 13万+

3动态规划进阶:序列DP深度解析

序列DP是动态规划中最常见和重要的类别之一,主要处理字符串、数组等序列上的问题。这类问题通常涉及子序列、子串、编辑距离等操作,是面试和竞赛中的高频考点。dp[i][j]:text1前i个字符和text2前j个字符的LCS长度dp[i][j]:word1前i个字符转换为word2前j个字符的最少操作数dp[i][j]:字符串s[i:j+1]的最长回文子序列长度定义状态dp[i]表示以第i个元素结尾的某种性质dp[i][j]表示子序列/子串s[i:j+1]的性质初始化基础情况:空字符串、单个字符等。

weixin_43680337的博客 971

【序列DP】最长递增子序列的个数 / 最长定差子序列 / 等差数列划分 II - 子序列

最长递增子序列的个数 / 最长定差子序列 / 等差数列划分 II - 子序列

小羊的博客 969

序列DP常见问题

最大子序列和 HUD1003 s是该序列从头到尾逐个相加的和,每次与最大值相比较并且更新最大值和记录结束的位置,然后如果s<0,那么可以更新起始位置,并且s归0. #include<stdio.h> int a[100005],t,n,nu=0; int main(){ scanf("%d",&t); while(t--){ nu++; scanf("%d",&n); for(int i=0;i<n;i+

lalalala2536的博客 465

经典的序列dp问题

序列dp

ComingLiu的博客 262

序列DP P375

这道题目,看一眼就知道是一个DP,但是状态搞错了,然后就写了好久,都没有写出来,看了一下题解,瞬间恍然大悟,隔了一天再去写,一下子就写出来了。但是我是想用dp[i][0] 就去代表从1 到 i 的最小数值,状态没有跟上来,而且最近这种dp没有怎么做,就忘了。原因:我把状态想简单了,应该是dp[i][j] 对应i 到 j 的最小数值,

qq_51964119的博客 154

双序列DP

1. 两个子序列的最大点积 https://leetcode-cn.com/problems/max-dot-product-of-two-subsequences/ 给你两个数组nums1和nums2。 请你返回 nums1 和 nums2 中两个长度相同的 非空 子序列的最大点积。 数组的非空子序列是通过删除原数组中某些元素(可能一个也不删除)后剩余数字组成的序列,但不能改变数字间相对顺序。比方说,[2,3,5]是[1,2,3,4,5]的一个子序列而[1,5,3]不是。 ...

HackingGate的博客 705
上一篇: UVA 11426
下一篇: Codeforces Round #705 (Div. 2)/D. GCD of an Array
WedsonLin
博客等级 码龄7年 1粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值