Problema 1:
Se da o scara cu N trepte.Intr un pas poti urca 1 sau 2 trepte.In cate moduri distincte
poti urca in varf? https:https://leetcode.com/problems/climbing-stairs/
Pe scara M poti sa ajungi de pe scara M-1 si de pe scara M-2=>Pe scara M
poti ajunge in cate moduri ai ajuns pe scara M-1 + in cate moduri ai ajuns pe scara M-2.
Varianta 1:Recursiv ineficient
int f(int n)
{
if(n == 1)
return 1;
else if(n == 2)
return 2;
else if(n > 0)
return f(n - 1) + f(n - 2);
}
Varianta 2: recursiv eficient
int f(int n)
{
aux[1] = 1;
aux[2] = 2;
if(aux[n] != 0)
{
return aux[n];
}
else
{
int x = f(n - 1) + f(n - 2);
return x;
aux[n] = x;
}
}
Varianta 3: programare dinamica
#include<bits/stdc++.h>
using namespace std;
int n,dp[50];
int main()
{
cin>>n;
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i <= n;i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
cout<<dp[n];
}
Problema 2:
Se dau N pietre,fiecare avand o inaltime.Intr un pas poti sari 1 sau 2
pietre.Costul unui salt este |inaltime piatra plecare – inaltime piatra sosire|.Care e
costul minim pentru a ajunge la piatra N? https://atcoder.jp/contests/dp/tasks/dp_a
10
30
20
40
Pe piatra M trebuie sa vedem daca este mai putin costisitor sa venim de pe
piatra m-1 sau de pe piatra m-2
a
10
30
20
40
dp
0
20
10
30
dp[i] = min(dp[i - 2] + abs(a[i - 2] - a[i]),dp[i - 1] + abs(a[i - 1] - a[i]));
costul pana
la i-2
cosutul saltului
costul pana
la i-1
costul saltului
#include<bits/stdc++.h>
using namespace std;
int n,dp[100010],a[100010];
int main()
{
cin>>n;
for(int i = 1;i <= n;i++)
cin>>a[i];
dp[1] = 0;
dp[2] = abs(a[2] - a[1]);
for(int i = 3;i <= n;i++)
{
dp[i] = min(dp[i - 2] + abs(a[i - 2] - a[i]),dp[i - 1] + abs(a[i - 1] - a[i]));
}
cout<<dp[n];
}
Problema 3:
Se dau N pietre,fiecare avand o inaltime.Intr un pas poti sari K pietre.Costul unui
salt este |inaltime piatra plecare – inaltime piatra sosire|.Care e costul minim pentru a
ajunge la piatra N? https://atcoder.jp/contests/dp/tasks/dp_b
10
30
40
50
20
K=3
Pe piatra M trebuie sa vedem de pe care dintre ultimele K trepte este cel mai putin
costisitor sa venim
#include<bits/stdc++.h>
using namespace std;
int n,dp[100010],a[100010],k;
int main()
{
cin>>n>>k;
for(int i = 1;i <= n;i++)
cin>>a[i];
dp[2] = abs(a[2] - a[1]);
for(int i = 3;i <= n;i++)
{
dp[i] = INT_MAX;
for(int j = max(i - k,1);j < i;j++)
{
dp[i] = min(dp[i],dp[j] + abs(a[i] - a[j]));
}
}
cout<<dp[n];
}
Probleme recursivitate:
https://www.pbinfo.ro/probleme/1809/powerrec
https://www.pbinfo.ro/probleme/842/dinti
https://www.pbinfo.ro/probleme/4307/monede-x
https://www.pbinfo.ro/probleme/3341/oaste2
https://www.pbinfo.ro/probleme/1660/fotbal
https://www.pbinfo.ro/probleme/837/fill
https://www.pbinfo.ro/probleme/1864/moscraciun