2023河南萌新联赛第(六)场:河南理工大学 H - 左右横跳

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 1n104
1 ≤ m ≤ 1000 1 \le m \le 1000 1m1000
1 ≤ k ≤ 1 0 4 1 \le k \le 10^4 1k104
0 ≤ a i j ≤ 1 0 4 0 \le a_{ij} \le 10^4 0aij104

输出描述:

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

示例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();
    }
}

你可能感兴趣的:(#,Java刷题,#,DP动态规划,java)