Rezolvare completă PbInfo #2962 traseu3

O suprafață de teren de formă dreptunghiulară este divizată în N fâșii orizontale și M fâșii verticale, de lățimi egale. Se formează astfel N x M zone de formă pătrată, cu latura egală cu o unitate. Astfel, suprafața este reprezentată sub forma unui tablou bidimensional cu N linii și M coloane, în care pentru fiecare zonă este memorat un număr ce reprezintă altitudinea zonei respective. Interesant este că în tablou apar toate valorile 1, 2, …, N•M. Suprafața este destinată turismului. Deoarece spre laturile de Est și Sud ale suprafeței există peisaje de o frumusețe uimitoare, se dorește găsirea unor trasee turistice în care deplasarea să se realizeze cu pași de lungime unitară mergând doar spre Est și spre Sud. O comisie, care trebuie să rezolve această problemă, a stabilit că un traseu este atractiv dacă și numai dacă ultima poziție a traseului are altitudinea mai mare decât prima poziție a traseului. Un traseu poate începe, respectiv se poate încheia, în oricare dintre zonele terenului, cu respectarea condițiilor anterioare.

Cerința

Se cere să se determine numărul maxim Z de zone pe care le poate avea un traseu atractiv.

Date de intrare

În fișierul de intrare traseu.in se află scrise pe prima linie numerele N și M, cu semnificația din enunț. Pe fiecare dintre următoarele N linii se află scrise câte M numere naturale, reprezentând, elementele tabloului bidimensional precizat în enunț. Numerele aflate pe aceeași linie a fișierului sunt separate prin câte un spațiu.

Date de ieșire

În fișierul de ieșire traseu.out se va scrie numărul Z, cu semnificația din enunț. Dacă nu există niciun traseu atractiv, atunci se va scrie 0.

Restricții și precizări

  • 1 ≤ N ≤ 500
  • 1 ≤ M ≤ 500
  • Pentru teste în valoare de 40 de puncte, N ≤ 50.
  • În concurs s-au acordat 10 puncte din oficiu. Aici s-au acordat pentru exemplele din enunț.

Exemplul 1:

traseu.in

3 4
12 11 10 6
7 5 4 3
9 2 8 1

traseu.out

4

Explicație

Traseele atractive de lungime 2 sunt: 7-9, 4-8, 2-8.
Traseele atractive de lungime 3 sunt: 5-2-8, 5-4-8.
Traseele atractive de lungime 4 (maximă) sunt: 7-5-4-8, 7-5-2-8, 7-9-2-8.

Exemplul 2:

traseu.in

3 3
5 8 7
9 6 4
3 1 2

traseu.out

3

Explicație

Traseele atractive de lungime 2 sunt: 5-8, 5-9, 1-2.
Traseele atractive de lungime 3 (maximă) sunt: 5-9-6, 5-8-6, 5-8-7.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema traseu3:

#include <stdio.h>
#include <stdlib.h>

struct NODE {
    int     r, c, v;
    struct NODE    *prev;
    struct NODE    *next;
};

void ddelete(struct NODE *n) {
    n->prev->next = n->next;
    n->next->prev = n->prev;
    free(n);
}

struct NODE* insert(struct NODE *prev, int r, int c, int v) {
    struct NODE *next  = prev->next;
    struct NODE *n     = (struct NODE *)malloc(sizeof(struct NODE));
    n->r = r; n->c = c; n->v = v;
    n->next     = next;
    n->prev     = prev;
    next->prev  = n;
    prev->next  = n;
    return n;
}

int main() {
    FILE    *f = fopen("traseu.in",  "r");
    FILE    *g = fopen("traseu.out", "w");
    struct NODE    row[500];
    struct NODE    *NODE[250000];
    int     m, n, v;
    
    fscanf(f, "%d %d", &m, &n);
    for (int i = 0; i < m; i++) {
        row[i].next = row[i].prev = &row[i];
        for (int j = 0; j < n; j++) {
            fscanf(f, "%d", &v); v--;
            NODE[v] = insert(row[i].prev, i, j, v);
        }
    }
    
    int ans = 0;
    for (int v = 0; v < m*n; v++) {
        struct NODE *x = NODE[v];
        for (int i = x->r; i < m; i++) {
            struct NODE *y = row[i].prev;
            int  d  = i - x->r + y->c - x->c;
            if (y->next != y && x->c <= y->c && d > ans) ans = d;
        }
        ddelete(x);
    }
    if(ans == 0)fprintf(g, "0");
    else fprintf(g, "%d", ans + 1);
    
    fclose(f);
    fclose(g);
    
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2962 traseu3

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2962 traseu3 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!