Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++]Największa suma w tablicy wielowymiarowej (Piramida)

Ostatnio zmodyfikowano 2014-12-14 14:57
Autor Wiadomość
RobaczeQ
Temat założony przez niniejszego użytkownika
[C++]Największa suma w tablicy wielowymiarowej (Piramida)
» 2014-12-14 00:41:52
Na poniższym rysunku przedstawiono piramidę, która ma 4 poziomy. Pola piramidy są wypełnione
liczbami. Ciemniejsze pola na rysunku oznaczają drogę w takiej piramidzie – droga zaczyna się w
polu na najwyższym poziomie piramidy i biegnie do jej podstawy po polach na kolejnych poziomach,
które stykają się swoimi podstawami. Długością takiej drogi jest suma liczb znajdujących się w polach
drogi. Droga zaciemniona na rysunku ma długość: 7 + 6 + 3 + 5 = 21.

http://prntscr.com/5gj6lo

Problem: oblicz długość najdłuższej drogi w piramidzie.
Przykładowa piramida pokazana powyżej ma więc następującą reprezentację w tablicy:

http://prntscr.com/5gj7xc

SPECYFIKACJA
Dane: Liczba naturalna n i tablica Pir[1..n;1..n], w której elementy Pir[i,j] dla i = 1, 2,…, n oraz j = 1,
2,…, i są dodatnimi liczbami całkowitymi.
Wynik: Ciąg n liczb j1, j2,…, jn, gdzie j1 = 1 oraz jk = jk-1 lub jk = jk-1 + 1 dla k = 2, 3,…, n taki, że suma
Pir[1,1] + Pir[2,j2] + Pir[3,j3] + … + Pir[n,jn] jest możliwie największa.



Czyli w programie ma obliczyć długość, jak i zapamiętać i wypisać jaką drogą doszedł do tego wyniku.

C/C++
#include <iostream>
#define n 3
using namespace std;
int P[ n ][ n ];

int program( int P[] )
{
    int smax = 0;
    int s1 = 0;
    int s2 = 0;
    /*
    for (int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            s=s+P[i,j];
            if (s>smax){smax=s;}
        }
    }
    */
    int i = 0;
    while( i <= n )
    {
        s1 = s1 + P[ i, i ];
        s2 = s2 + P[ i, i + 1 ];
        if( s1 > smax ) { smax = s1; }
        if( s2 > smax ) { smax = s2; }
        i++;
    }
    return smax;
}

int main()
{
    P[ 0 ][ 0 ] = 7;
    P[ 1 ][ 0 ] = 5;
    P[ 1 ][ 1 ] = 6;
    P[ 2 ][ 0 ] = 6;
    P[ 2 ][ 1 ] = 4;
    P[ 2 ][ 2 ] = 3;
    P[ 3 ][ 0 ] = 4;
    P[ 3 ][ 1 ] = 6;
    P[ 3 ][ 2 ] = 5;
    P[ 3 ][ 3 ] = 6;
    cout << program( P[ 3, 3 ] );
    return 0;
}

Jedynie co mam dobrze w tym programie to wypisanie danych...
Czy ktoś mógłby nakierować mnie na sposób jak to zrobić/napisać dla mnie schemat jak mogłoby to wyglądać/napisać chociaż pętlę która obliczy długość najdłuższej drogi?

Pozdrawiam i z góry dziękuję.
P-122837
darko202
» 2014-12-14 01:04:32
pierwsze co mi się nasuwa to struktura drzewo binarne
możesz na niej rozpiąć wszystkie możliwe drogi
a potem badając wszystkie gałęzie drogi znajdujesz interesującą Cię gałąź.

przykład np.
http://edu.i-lo.tarnow.pl/inf​/utils/002_roz/ol015.php


P-122840
RobaczeQ
Temat założony przez niniejszego użytkownika
» 2014-12-14 01:32:49
Dałoby się jakoś prościej? Za bardzo nie rozumiem jak miałbym to zrobić, jednak coś spróbuję dzięki temu drzewu.
P-122841
RobaczeQ
Temat założony przez niniejszego użytkownika
» 2014-12-14 14:57:43
Zrobiłem łopatologicznie, jeśli ktoś ma pomysł na inne rozwiązanie niż drzewo które trudno mi zrozumieć będę wdzięczny :)



C/C++
#include <iostream>
#define n 3
using namespace std;
int P[ n ][ n ];
int O[ 1 ];
void sp( int & smax, int s, int i, int O[] )
{
    if( s > smax ) { smax = s; O[ 0 ] = i; }
}
int main()
{
    P[ 0 ][ 0 ] = 7;
    P[ 1 ][ 0 ] = 5;
    P[ 1 ][ 1 ] = 6;
    P[ 2 ][ 0 ] = 6;
    P[ 2 ][ 1 ] = 4;
    P[ 2 ][ 2 ] = 3;
    P[ 3 ][ 0 ] = 4;
    P[ 3 ][ 1 ] = 6;
    P[ 3 ][ 2 ] = 5;
    P[ 3 ][ 3 ] = 6;
    /*
    cout << program(P[3,3]);
    */
   
    int smax = 0;
    int s = P[ 0 ][ 0 ] + P[ 1 ][ 0 ] + P[ 2 ][ 0 ] + P[ 3 ][ 0 ];
    sp( smax, s, 0, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 0 ] + P[ 2 ][ 0 ] + P[ 3 ][ 1 ];
    sp( smax, s, 1, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 0 ] + P[ 2 ][ 1 ] + P[ 3 ][ 1 ];
    sp( smax, s, 2, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 0 ] + P[ 2 ][ 1 ] + P[ 3 ][ 2 ];
    sp( smax, s, 3, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 1 ] + P[ 2 ][ 1 ] + P[ 3 ][ 1 ];
    sp( smax, s, 4, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 1 ] + P[ 2 ][ 1 ] + P[ 3 ][ 2 ];
    sp( smax, s, 5, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 1 ] + P[ 2 ][ 2 ] + P[ 3 ][ 2 ];
    sp( smax, s, 6, O );
    s = P[ 0 ][ 0 ] + P[ 1 ][ 1 ] + P[ 2 ][ 2 ] + P[ 3 ][ 3 ];
    sp( smax, s, 7, O );
   
    cout << smax << endl;
   
    if( O[ 0 ] == 0 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 0 ] << " " << P[ 2 ][ 0 ] << " " << P[ 3 ][ 0 ]; }
    if( O[ 0 ] == 1 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 0 ] << " " << P[ 2 ][ 0 ] << " " << P[ 3 ][ 1 ]; }
    if( O[ 0 ] == 2 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 0 ] << " " << P[ 2 ][ 1 ] << " " << P[ 3 ][ 1 ]; }
    if( O[ 0 ] == 3 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 0 ] << " " << P[ 2 ][ 1 ] << " " << P[ 3 ][ 2 ]; }
    if( O[ 0 ] == 4 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 1 ] << " " << P[ 2 ][ 1 ] << " " << P[ 3 ][ 1 ]; }
    if( O[ 0 ] == 5 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 1 ] << " " << P[ 2 ][ 1 ] << " " << P[ 3 ][ 2 ]; }
    if( O[ 0 ] == 6 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 1 ] << " " << P[ 2 ][ 2 ] << " " << P[ 3 ][ 2 ]; }
    if( O[ 0 ] == 7 ) { cout << P[ 0 ][ 0 ] << " " << P[ 1 ][ 1 ] << " " << P[ 2 ][ 2 ] << " " << P[ 3 ][ 3 ]; }
   
    return 0;
}
P-122858
« 1 »
  Strona 1 z 1