martedì 1 aprile 2014

[C++] Triangolo

            7
         3    8
       8    1   0
   2    7    4    4
4    5    2    6    5
Questo è un triangolo!
 Scrivete un programma che calcoli la più grande somma di numeri ottenibile seguendo un percorso che parta dalla cima del triangolo e termini da qualche parte sulla sua base. Ad ogni passo si può procedere diagonalmente in basso o a destra o a sinistra.

Input
Il programma deve leggere da un file di nome ‘input.txt’. La prima riga del file contiene un’unico intero N, il numero di righe del triangolo. Le successive N righe contengono un numero crescente di interi 2', la n-esima riga contiene n interi separati da uno spazio.

Output
Il programma deve scrivere in un file di nome ‘output.txt’ la somma massima ottenibile dal triangolo.

Assunzioni
1 < N ≤ 100
0 < i < 100

input.txt      output.txt
5                  30
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Partendo dal basso salviamo il punteggio maggiore fra i figli nel padre, il nonno di tutti (il vertice) avrà la risposta:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<cassert>
#include<fstream>
#include<iostream>

using namespace std;

#define UNKNOWN  -1
#define N  100

int t[N][N],n,memoRisp[N+1][N+1];


int main() {
  ifstream fin("input.txt"); assert( fin );
  fin >> n;
  for(int i = 0; i < n; i++)
    for(int j = 0; j <= i; j++)
       fin >> t[i][j];
  fin.close();


  for(int i = 0; i < n; i++)
    for(int j = 0; j <= i; j++)
       memoRisp[i][j] = UNKNOWN;


  for(int j = 0; j <= n; j++)
     memoRisp[n][j] = 0;
  for(int i = n-1; i >= 0; i--)
    for(int j = 0; j <= i; j++)
       memoRisp[i][j] = t[i][j] + max( memoRisp[i+1][j], memoRisp[i+1][j+1] );

  ofstream fout("output.txt"); assert( fout );
  fout << memoRisp[0][0] << endl;
  fout.close();

  return 0;
}

Nessun commento:

Posta un commento

Si prega di non commentare in modo volgare e/o offensivo.