Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<queue>
- using namespace std;
- int main()
- {
- int n,m,k;
- scanf("%d %d %d",&n,&m,&k);
- int board[n+1][m+1];
- for(int i = n ; i >= 1 ; i --){
- for(int j = 1 ; j <= m ; j ++){
- scanf("%d",&board[i][j]);
- }
- }
- int dp[m+1];
- int ndp[m+1];
- for(int i = 1 ; i <= m ; i ++){
- dp[i] = board[1][i];
- }
- priority_queue<pair<int,int>/* ,vector<pair<int,int> > ,greater<pair<int,int> > */ > pq;
- for(int i = 2 ; i <= n ; i ++){
- for(int j = 1 ; j <= k + 1 ; j ++){
- pq.push({dp[j],j});
- }
- for(int j = 1 ; j <= m ; j ++){
- while(!pq.empty() && pq.top().second < j - k)pq.pop();
- ndp[j] = board[i][j] + pq.top().first;
- if(j+k+1 <= m)pq.push({dp[j+k+1],j+k+1});
- }
- while(!pq.empty())pq.pop();
- for(int j = 1 ; j <= m ; j ++){
- dp[j] = ndp[j];
- }
- }
- int ans = 0;
- for(int i = 1 ; i <= m ; i ++){
- if(dp[i] > ans)ans = dp[i];
- }
- printf("%d",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement