Я только начал динамическое программирование, но я не могу продолжать, поскольку у меня постоянно появляется ошибка ошибки сегментации.
Я пытаюсь решить этот вопрос:
Для положительного целого числа вы можете выполнить любой из следующих 3 шагов.1.) Вычтите 1 из этого.(n = n - 1), 2.) Если его делится на 2, делим на 2. (если n% 2 == 0, то n = n / 2), 3.) Если его делим на 3, делим на 3. (если n% 3 == 0, то n = n / 3).Теперь вопрос заключается в том, что с учетом положительного целого числа n найти минимальное количество шагов, которое занимает от n до 1
Использование памятки
#include<bits/stdc++.h>
using namespace std;
int get_min_steps(int n,int visited[])
{
int r;
cout<<"0"<<"\n";
if(n==1)
{
cout<<n<<" "<<"0"<<"\n";
return 0;
}
else if(visited[n]!=-1)
{
cout<<n<<" "<<visited[n]<<"\n";
return visited[n];
}
r=1+get_min_steps(n-1,visited);
if(n%2==0)
{
cout<<"3"<<"\n";
r=min(r,get_min_steps(r/2,visited));
}
else if(n%3==0)
{
cout<<"4"<<"\n";
r=min(r,get_min_steps(r/3,visited));
}
cout<<"n"<<" "<<r<<"\n";
visited[n]=r;
return r;
}
int main()
{
int n;
cout<<"Enter the number : ";
cin>>n;
int visited[n+1];
for(int i=0;i<n+1;i++)
{
visited[i]=-1;
}
int min=get_min_steps(n,visited);
cout<<min<<"\n";
return 0;
}
Использование подхода снизу вверх
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cout<<"Enter any number : ";
cin>>n;
int a[n+1];
a[1]=0;
for(int i=2;i<=n;i++)
{
int r=1+a[i-1];
if(r%2==0)
{
r=min(r,1+a[n%2]);
}
else if(r%3==0)
{
r=min(r,1+a[n%3]);
}
a[i]=r;
}
cout<<"Big day";
while(n!=1)
{
cout<<a[n]<<" ";
cout<<"#";
n=a[n];
}
}