跳石板(牛客)

目录

一、题目

二、代码

(一)解法一:超时了

(二)优化


一、题目

跳石板_牛客题霸_牛客网

二、代码

(一)解法一:超时了

cpp 复制代码
#include <climits>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int MinSteps(int N, int M)
{
	vector<int>dp(M + 1, INT_MAX);//表示从出发到石板i的最少步数
	dp[N] = 0;
	for (int i = N; i < M; i++)
	{
		if (dp[i] == INT_MAX)
		{
			continue;
		}
		for (int j = 2; j <= i / 2; j++)
		{
			if (i + j <= M && i % j == 0)
			{
				dp[i + j] = min(dp[i + j], dp[i] + 1);
			}
		}
	}

	return dp[M] == INT_MAX ? -1 : dp[M];
}
int main()
{
	int N, M;
	cin >> N >> M;
	cout << MinSteps(N, M);
	return 0;
}

(二)优化

  • 如果 i 不是质数,那么它的一个约数一定在 sqrt(i) 以下,而另一个约数一定在 sqrt(i) 以上
cpp 复制代码
for (int j = 2; j <= sqrt(i); j++)
{
	if (i % j == 0 && i + j <= M)
	{
		dp[i + j] = min(dp[i + j], dp[i] + 1);
	}
	if (i % j == 0 && i + i / j <= M)
	{
		dp[i + i / j] = min(dp[i + i / j], dp[i] + 1);
	}
}
cpp 复制代码
#include <climits>
#include <cmath>
#include <iostream>
#include <vector>
using namespace std;
int MinSteps(int N, int M)
{
	vector<int>dp(M + 1, INT_MAX);//表示从出发到石板i的最少步数
	dp[N] = 0;
	for (int i = N; i < M; i++)
	{
		if (dp[i] == INT_MAX)
		{
			continue;
		}
		for (int j = 2; j <=sqrt(i); j++)
		{
			if (i % j == 0 && i+j<=M )
			{
				dp[i + j] = min(dp[i + j], dp[i] + 1);
			}
            if(i%j ==0 && i+i/j<=M)
            {
                dp[i + i/j] = min(dp[i + i/j], dp[i] + 1);
            }
		}
	}

	return dp[M] == INT_MAX?-1:dp[M];
}
int main()
{
	int N, M;
	cin >> N >> M;
	cout << MinSteps(N, M);
	return 0;
}
相关推荐
雾月555 分钟前
LeetCode 1292 元素和小于等于阈值的正方形的最大边长
java·数据结构·算法·leetcode·职场和发展
Pasregret24 分钟前
访问者模式:分离数据结构与操作的设计模式
数据结构·设计模式·访问者模式
OpenC++34 分钟前
【C++QT】Buttons 按钮控件详解
c++·经验分享·qt·leetcode·microsoft
YuforiaCode1 小时前
第十二届蓝桥杯 2021 C/C++组 直线
c语言·c++·蓝桥杯
知来者逆2 小时前
计算机视觉——速度与精度的完美结合的实时目标检测算法RF-DETR详解
图像处理·人工智能·深度学习·算法·目标检测·计算机视觉·rf-detr
阿让啊2 小时前
C语言中操作字节的某一位
c语言·开发语言·数据结构·单片机·算法
এ᭄画画的北北2 小时前
力扣-160.相交链表
算法·leetcode·链表
草莓啵啵~2 小时前
搜索二叉树-key的搜索模型
数据结构·c++
共享家95272 小时前
深入理解C++ 中的list容器
c++
孞㐑¥2 小时前
C++11介绍
开发语言·c++·经验分享·笔记