Jest dane zadanie: Mamy tablicę [1..max,1..max]. Napisz funkcję, która zwraca długość najdłuższego podciągu rosnącego
znajdującego się w dowolnym (jednym) wierszu, którego wszystkie elementy są ze sobą względnie
pierwsze.
#include<iostream>
using namespace std;
const int MAX = 5;
void wypisz(int tab[][MAX])
{
for(int y=0;y<MAX;y++)
{
for(int x=0;x<MAX;x++)
cout<<tab[y][x]<<" ";
cout<<endl;
}
}
bool wzglp(int a, int b)
{
int c;
while(b!=0)
{
c=a%b;
a=b;
b=c;
}
if(a==1)
return true;
return false;
}
int najdluzszy(int tab[][MAX], int pozx,int pozy, int gleb, int iloczyn)
{
int m=0;
int t=0;
for(int npozx=pozx+1;npozx<MAX;npozx++)
{
if(tab[pozy][npozx]>tab[pozy][pozx] && wzglp(tab[pozy][npozx],iloczyn)==1)
t=najdluzszy(tab,npozx,pozy,gleb+1,iloczyn*tab[pozy][npozx]);
if(t>m)
m=t;
}
if(gleb>m)
return gleb;
return m;
}
int wiersze(int tab[][MAX])
{
int m=0;
int t=0;
for(int y=0;y<MAX;y++)
{
t=najdluzszy(tab,0,y,1,1);
if(t>m)
m=t;
}
return m;
}
int main()
{
int tab[MAX][MAX];
for(int y=0;y<MAX;y++)
for(int x=0;x<MAX;x++)
tab[y][x]=1;
tab[2][0]=1;
tab[2][1]=4;
tab[2][2]=6;
tab[2][3]=5;
tab[2][4]=11;
tab[1][0]=1;
tab[1][1]=2;
tab[1][2]=3;
tab[1][3]=5;
tab[1][4]=11;
wypisz(tab);
int m=0;
m=wiersze(tab);
cout<<m<<endl;
}
Mam do Was pytanie :)
Napisałem program rekurencyjnie i działa, lecz autor sugeruje rozwiązanie iteracyjne, czy da się sprawę sensownie rozwiązać iteracyjnie?
Czy w programie rekurencyjnym lepiej przekazywać największą wartość 'w górę' przez returny czy przez referencję? (u mnie przez returny)