Co zrobić aby poniższy program który musi się wywoływać rekurencyjnie obniżył czas działania? Ponieważ przy dużych danych wejściowych się nie wyrabiam w czasie.
Program przyjmuje na wejściu np:
8
12 13 33 10 24 9 17 22
22 32 28 4 5 11 7 26
32 5 29 7 23 10 4 24
10 34 27 2 6 1 33 30
19 29 34 32 10 16 5 24
6 1 3 34 27 19 27 12
26 10 3 29 1 14 25 2
10 10 1 25 17 15 17 21
czyli pole n na n (w tym przypadku 8 x 8 )
oraz wartości do każdego pola, program oblicza najlepsze ustawienie n pionków, tak aby suma z pod tych pól gdzie pionki są wstawiane była jak najmniejsza, drugim warunkiem jest to aby każdy pionek znalazł się w innym wierszu i innej kolumnie (nie zbijają się nawzajem).
wynikiem jest n (w naszym przykpadku 8 ) liczb oznaczających numer rzędu, w którym należy ustawić pionek dla każdej kolumny.
czyli w naszym przypadku wynikiem będzie:
0 5 7 2 1 3 4 6
(numerujemy od zera do n-1 wiersze i kolumny oczywiście, jak to w tablicach jest)
czyli najmniejsza sumą jest 34.
#include
using namespace std;
int minimum=999999;void funkcja(int unsigned n,unsigned int * tab0,unsigned int * tab1,unsigned int i,unsigned int ** tablica,unsigned int * tablica2)
{
unsigned int sum=0;
for(int k=0;k<n;k++)
{
if(tab1[k]==1)
{
tab0[i]=k;
tab1[k]=0;if(i==n-1){
for(int l=0;l<n;l++)
{
sum+=tablica[tab0[l]][l];}
if(sum<minimum)
{
minimum=sum;for(int m=0;m<n;m++) { tablica2[m]=tab0[m]; } } } else funkcja(n,tab0,tab1,i+1,tablica,tablica2);
tab1[k]=1;
}
}
}
int main()
{
unsigned int n;
cin>>n;
unsigned int ** tablica = new unsigned int * [n];
for(int i=0;i<n;i++)
{
tablica[i]= new unsigned int [n];
}
unsigned int * tablica2 = new unsigned int[n];unsigned int * tab0 = new unsigned int[n];
unsigned int * tab1 = new unsigned int[n];
for(int i=0;i<n;i++)
{
tab0[i]=0;
tab1[i]=1;
for(int j=0;j<n;j++)
{
cin>>tablica[i][j];
}
}
funkcja(n,tab0,tab1,0,tablica,tablica2);for(int i=0;i<n;i++)
{
cout<<tablica2[i]<<" ";
}delete [] tablica[0];
delete [] tablica;
delete [] tablica2;
delete [] tab0;
delete [] tab1;
return 0;
}
da się to na pewno napisać bardziej optymalnie, albo za dużo razy wywołuje mi się funkcja rekurencyjna albo nie wiem za dużo pętli for w funkcji? ale nie mam pomysłu jak to zoptymalizować, dziękuję za każdą pomoc.