Advertisement
SuitNdtie

COI road cube

May 11th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.92 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<queue>
  3. using namespace std;
  4. int main()
  5. {
  6.     int n,m,k;
  7.     scanf("%d %d %d",&n,&m,&k);
  8.     int board[n+1][m+1];
  9.    
  10.     for(int i = n ; i >= 1 ; i --){
  11.         for(int j = 1 ; j <= m ; j ++){
  12.             scanf("%d",&board[i][j]);
  13.         }
  14.     }
  15.    
  16.     int dp[m+1];
  17.     int ndp[m+1];
  18.     for(int i = 1 ; i <= m ; i ++){
  19.         dp[i] = board[1][i];
  20.     }
  21.     priority_queue<pair<int,int>/* ,vector<pair<int,int> > ,greater<pair<int,int> > */ > pq;
  22.    
  23.     for(int i = 2 ; i <= n ; i ++){
  24.         for(int j = 1 ; j <= k + 1 ; j ++){
  25.             pq.push({dp[j],j});
  26.         }
  27.         for(int j = 1 ; j <= m ; j ++){
  28.             while(!pq.empty() && pq.top().second < j - k)pq.pop();
  29.             ndp[j] = board[i][j] + pq.top().first;
  30.             if(j+k+1 <= m)pq.push({dp[j+k+1],j+k+1});
  31.         }
  32.         while(!pq.empty())pq.pop();
  33.         for(int j = 1 ; j <= m ; j ++){
  34.             dp[j] = ndp[j];
  35.         }
  36.     }
  37.     int ans = 0;
  38.     for(int i = 1 ; i <= m ; i ++){
  39.         if(dp[i] > ans)ans = dp[i];
  40.     }
  41.     printf("%d",ans);
  42.     return 0;
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement