Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
2461 - V
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
Se consideră un tablou bidimensional cu <code>m</code> linii şi <code>n</code> coloane. Se numeşte traseu în <code>V</code> o parcurgere prin elementele tabloului astfel: * se pleacă întotdeauna dintr-un element de pe prima linie a tabloului, se ajunge în final într-un alt element de pe prima linie a tabloului, trecând prin cel puţin 3 elemente, fără a trece printr-un element de mai multe ori; * parcurgerea elementelor tabloului se face în forma unei singure litere <code>V</code> ca în desen, dintr-un element putându-se trece doar într-un alt element imediat vecin pe diagonală. Fiecare element al tabloului conţine valori întregi. La parcurgerea traseului se calculează suma elementelor de pe traseu. = Cerința = Determinaţi traseul în <code>V</code> care are suma maximă. În cazul în care există mai multe trasee de sumă maximă, se va alege traseul care parcurge cele mai puţine elemente. Dacă şi în acest caz există mai multe soluţii, se alege traseul cel mai din stânga (cel cu indicele coloanei de pornire cel mai mic). = Date de intrare = Din fişierul de intrare <code>v.in</code> se citesc de pe prima linie valorile naturale <code>m</code> şi <code>n</code>, separate printr-un spaţiu, reprezentând numărul de linii şi numărul de coloane ale tabloului. Pe următoarele <code>m</code> linii se află câte <code>n</code> valori întregi separate prin spaţii, reprezentând elementele tabloului. = Date de ieșire = Fişierul de ieşire <code>v.out</code> va conţine o singură linie pe care vor fi scrise trei valori naturale <code>S C L</code>, reprezentând suma maximă, coloana de pornire şi respectiv linia pe care se află vârful <code>V</code>-ului traseului determinat. = Restricții și precizări = * <code>1 ≤ m, n ≤ 1500</code> * <code>-60000 ≤</code> valorile elementelor tabloului <code>≤ 60000</code> * Pentru datele de test suma valorilor din elementele oricărui traseu va fi între <code>-2 000 000 000</code> şi <code>2 000 000 000</code> . * Pentru 50% din teste <code>1 ≤ m, n ≤ 101</code> * Pentru 70% din teste <code>1 ≤ m, n ≤ 1000</code> * Nota: Această problemă conține restricții și teste îmbunătățite = Exemplu: = '''v.in''' 5 9 3 4 12 4 6 7 9 5 12 0 4 5 7 9 -5 1 1 5 0 98 34 0 1 7 7 1 1 6 7 8 -9 0 2 3 5 22 47 62 31 55 0 83 23 77 10 '''v.out''' 54 1 3 <syntaxhighlight lang="python" line="1"> def find_best_v_path(matrix): m = len(matrix) n = len(matrix[0]) # Step 3: Calculate dp_down dp_down = [[float('-inf')] * n for _ in range(m)] dp_down[0] = matrix[0][:] for i in range(1, m): for j in range(n): if j > 0: dp_down[i][j] = max(dp_down[i][j], dp_down[i-1][j-1] + matrix[i][j]) if j < n - 1: dp_down[i][j] = max(dp_down[i][j], dp_down[i-1][j+1] + matrix[i][j]) # Step 4: Calculate dp_up dp_up = [[float('-inf')] * n for _ in range(m)] dp_up[m-1] = matrix[m-1][:] for i in range(m-2, -1, -1): for j in range(n): if j > 0: dp_up[i][j] = max(dp_up[i][j], dp_up[i+1][j-1] + matrix[i][j]) if j < n - 1: dp_up[i][j] = max(dp_up[i][j], dp_up[i+1][j+1] + matrix[i][j]) # Step 5: Find the maximum sum path max_sum = float('-inf') min_length = float('inf') best_path_start = -1 best_path_end = -1 for i in range(m): for j in range(n): if dp_down[i][j] == float('-inf') or dp_up[i][j] == float('-inf'): continue total_sum = dp_down[i][j] + dp_up[i][j] - matrix[i][j] length = 2 * i + 1 if total_sum > max_sum or (total_sum == max_sum and length < min_length): max_sum = total_sum min_length = length best_path_start = j best_path_end = j return max_sum, best_path_start, best_path_end # Exemplu de utilizare: matrix = [ [3, 1, 7], [2, 5, 4], [1, 6, 2] ] result = find_best_v_path(matrix) print(result) </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width