左右横跳
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

        小D想和你玩个游戏,游戏规则如下:
        给出 m 个高度为 n 的柱子,每个柱子的每一单位长度上有一定的分数 a_{ij} 表示在第 j 个柱子上的第 i 个单位长度上的分数,玩家可以选择从任意一个柱子上单位长度为 1 处开始,有以下两种操作:
        (1)向上跳 1 个单位长度,高度由 i 变为 i+1,且不能跳到其他的柱子上并且得不到该位置分数
        (2)向上跳 k 个单位长度,高度由 i 变为 i+k,且可以跳到任意柱子上并获得该位置上的分数
        (3)当以上两种操作都无法进行时,游戏结束并结算得分。
        玩家初始时在单位长度 1 处,且初始位置分数可以直接获得。请你求出最高能获得多少分。

输入描述:

第一行包含三个整数 n,m,k 分别表示柱子的高度,数量,和跳跃的距离。
从第二行到第 n+1 行每行 m 个整数 a_{ij} 表示第 j 根柱子上高度为i 的分数
1 \le n \le 10^4
1 \le m \le 1000
1 \le k \le 10^4
0 \le a_{ij} \le 10^4

输出描述:

一个整数表示可以取得的分数的最大值
示例1

输入

复制
5 3 2
1 4 3
2 2 5
4 3 4
7 2 7
1 2 1

输出

复制
11

说明

从第2列开始,初始分数为4,向上移动一个单位长度(不获取分数)到达第2行第2列,再向上跳k=2个单位长度到达第4行第1列,或第4行第3列,总分数都是11