2023河南萌新联赛第(六)场:河南理工大学 H - 左右横跳
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小D想和你玩个游戏,游戏规则如下:
给出
m
m
m 个高度为
n
n
n 的柱子,每个柱子的每一单位长度上有一定的分数
a
i
j
a_{ij}
aij 表示在第
j
j
j 个柱子上的第
i
i
i 个单位长度上的分数,玩家可以选择从任意一个柱子上单位长度为
1
1
1 处开始,有以下两种操作:
(1)向上跳 1 1 1 个单位长度,高度由 i i i 变为 i + 1 i+1 i+1,且不能跳到其他的柱子上并且得不到该位置分数;
(2)向上跳 k k k 个单位长度,高度由 i i i 变为 i + k i+k i+k,且可以跳到任意柱子上并获得该位置上的分数;
(3)当以上两种操作都无法进行时,游戏结束并结算得分。
玩家初始时在单位长度 1 1 1 处,且初始位置分数可以直接获得。请你求出最高能获得多少分。
输入描述:
第一行包含三个整数
n
,
m
,
k
n,m,k
n,m,k 分别表示柱子的高度,数量,和跳跃的距离。
从第二行到第
n
+
1
n+1
n+1 行每行
m
m
m 个整数
a
i
j
a_{ij}
aij 表示第
j
j
j 根柱子上高度为
i
i
i 的分数
1
≤
n
≤
1
0
4
1 \le n \le 10^4
1≤n≤104
1
≤
m
≤
1000
1 \le m \le 1000
1≤m≤1000
1
≤
k
≤
1
0
4
1 \le k \le 10^4
1≤k≤104
0
≤
a
i
j
≤
1
0
4
0 \le a_{ij} \le 10^4
0≤aij≤104
输出描述:
一个整数表示可以取得的分数的最大值
示例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
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] str = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int m = Integer.parseInt(str[1]);
int k = Integer.parseInt(str[2]);
int[] a = new int[n + 1], dp = new int[n + 1];
for (int i = 1; i <= n; i++) {
int mx = -1;
str = bf.readLine().split(" ");
for (int j = 1; j <= m; j++) {
int x = Integer.parseInt(str[j - 1]);
mx = Math.max(mx, x);
}
a[i] = mx;
}
dp[1] = a[1];
for (int i = 2; i <= n; i++) {
if (i - k >= 1) dp[i] = Math.max(dp[i - 1], dp[i - k] + a[i]);
else dp[i] = dp[i - 1];
}
bw.write(dp[n]+"");
bw.close();
}
}