Advertisement
a53

Tmax

a53
Oct 11th, 2017
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.51 KB | None | 0 0
  1. /* Implementare: Cristi Dospra
  2. Punctaj: 100p
  3. Utilizat: Programare Dinamica + fstream
  4. Complexitate: O(N^2)
  5. */
  6.  
  7. #include <fstream>
  8. #include <algorithm>
  9. using namespace std;
  10.  
  11. #define Nmax 1002
  12.  
  13. ifstream fin ( "tmax.in" );
  14. ofstream fout ( "tmax.out" );
  15.  
  16. int N, M, v[Nmax][Nmax];
  17. long long SusJos[Nmax][Nmax], JosSus[Nmax][Nmax], StDr[Nmax][Nmax], DrSt[Nmax][Nmax];
  18.  
  19. const long long inf = 1000000000000000000LL;
  20.  
  21. long long val, SumMax = -inf;
  22. int NrT = 0;
  23.  
  24.  
  25. void Precalc()
  26. {
  27.  
  28. for ( int i = 1; i <= N; ++i )
  29. {
  30. for ( int j = 1; j <= M; ++j )
  31. StDr[i][j] = max ( StDr[i][j-1] + v[i][j], 1LL * v[i][j] );
  32.  
  33. for ( int j = M; j >= 1; --j )
  34. DrSt[i][j] = max ( DrSt[i][j+1] + v[i][j], 1LL * v[i][j] );
  35. }
  36.  
  37. for ( int j = 1; j <= M; ++j )
  38. {
  39. for ( int i = 1; i <= N; ++i )
  40. SusJos[i][j] = max ( SusJos[i-1][j] + v[i][j], 1LL * v[i][j] );
  41.  
  42. for ( int i = N; i >= 1; --i )
  43. JosSus[i][j] = max ( JosSus[i+1][j] + v[i][j], 1LL * v[i][j] );
  44. }
  45. }
  46.  
  47. void Check ( long long val )
  48. {
  49.  
  50. if ( val > SumMax )
  51. {
  52. SumMax = val;
  53. NrT = 1;
  54. }
  55. else if ( val == SumMax )
  56. NrT++;
  57.  
  58. }
  59.  
  60. void Read()
  61. {
  62.  
  63. fin >> N >> M;
  64.  
  65. for ( int i = 1; i <= N; ++i )
  66. for ( int j = 1; j <= M; ++j )
  67. fin >> v[i][j];
  68. }
  69.  
  70. void Solve()
  71. {
  72.  
  73. for ( int i = 1; i <= N; ++i )
  74. {
  75. for ( int j = 1; j <= M; ++j )
  76. {
  77.  
  78. // In sus
  79. if ( j > 1 && j < M && i > 2 )
  80. {
  81. val = StDr[i][j-1] + v[i][j] + DrSt[i][j+1] + v[i-1][j] + SusJos[i-2][j];
  82. Check ( val );
  83. }
  84.  
  85. // In jos
  86. if ( j > 1 && j < M && i < N-1 )
  87. {
  88. val = StDr[i][j-1] + v[i][j] + DrSt[i][j+1] + v[i+1][j] + JosSus[i+2][j];
  89. Check ( val );
  90. }
  91.  
  92. // In stanga
  93. if ( i > 1 && i < N && j > 2 )
  94. {
  95. val = StDr[i][j-2] + v[i][j-1] + v[i][j] + SusJos[i-1][j] + JosSus[i+1][j];
  96. Check ( val );
  97. }
  98.  
  99. // In dreapta
  100. if ( i > 1 && i < N && j < M-1 )
  101. {
  102. val = SusJos[i-1][j] + JosSus[i+1][j] + v[i][j] + v[i][j+1] + DrSt[i][j+2];
  103. Check ( val );
  104. }
  105. }
  106. }
  107. }
  108.  
  109. void Write ()
  110. {
  111. fout<<SumMax<<' '<<NrT;
  112. }
  113.  
  114. int main()
  115. {
  116. Read();
  117. Precalc();
  118. Solve();
  119. Write();
  120. return 0;
  121. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement