Advertisement
a53

Tmax

a53
Jul 30th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.42 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. for ( int i = 1; i <= N; ++i ){
  28. for ( int j = 1; j <= M; ++j )
  29. StDr[i][j] = max ( StDr[i][j-1] + v[i][j], 1LL * v[i][j] );
  30.  
  31. for ( int j = M; j >= 1; --j )
  32. DrSt[i][j] = max ( DrSt[i][j+1] + v[i][j], 1LL * v[i][j] );
  33. }
  34.  
  35. for ( int j = 1; j <= M; ++j ){
  36. for ( int i = 1; i <= N; ++i )
  37. SusJos[i][j] = max ( SusJos[i-1][j] + v[i][j], 1LL * v[i][j] );
  38.  
  39. for ( int i = N; i >= 1; --i )
  40. JosSus[i][j] = max ( JosSus[i+1][j] + v[i][j], 1LL * v[i][j] );
  41. }
  42. }
  43.  
  44. void Check ( long long val ){
  45.  
  46. if ( val > SumMax ){
  47. SumMax = val;
  48. NrT = 1;
  49. }
  50. else if ( val == SumMax )
  51. NrT++;
  52.  
  53. }
  54.  
  55. void Read(){
  56.  
  57. fin >> N >> M;
  58.  
  59. for ( int i = 1; i <= N; ++i )
  60. for ( int j = 1; j <= M; ++j )
  61. fin >> v[i][j];
  62. }
  63.  
  64. void Solve(){
  65.  
  66. for ( int i = 1; i <= N; ++i ){
  67. for ( int j = 1; j <= M; ++j ){
  68.  
  69. // In sus
  70. if ( j > 1 && j < M && i > 2 ){
  71. val = StDr[i][j-1] + v[i][j] + DrSt[i][j+1] + v[i-1][j] + SusJos[i-2][j];
  72. Check ( val );
  73. }
  74.  
  75. // In jos
  76. if ( j > 1 && j < M && i < N-1 ){
  77. val = StDr[i][j-1] + v[i][j] + DrSt[i][j+1] + v[i+1][j] + JosSus[i+2][j];
  78. Check ( val );
  79. }
  80.  
  81. // In stanga
  82. if ( i > 1 && i < N && j > 2 ){
  83. val = StDr[i][j-2] + v[i][j-1] + v[i][j] + SusJos[i-1][j] + JosSus[i+1][j];
  84. Check ( val );
  85. }
  86.  
  87. // In dreapta
  88. if ( i > 1 && i < N && j < M-1 ){
  89. val = SusJos[i-1][j] + JosSus[i+1][j] + v[i][j] + v[i][j+1] + DrSt[i][j+2];
  90. Check ( val );
  91. }
  92. }
  93. }
  94. }
  95.  
  96. void Write (){
  97. fout << SumMax << " " << NrT;
  98. }
  99.  
  100. int main(){
  101.  
  102. Read();
  103. Precalc();
  104. Solve();
  105. Write();
  106.  
  107. return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement