目录
一、题目
二、代码
(一)解法一:超时了
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;
}