2023河南萌新联赛第(六)场:河南理工大学 B - 这是dp题吗
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小l同学非常喜欢三角形,现在他想出个题目给小R同学做,想要考考小R同学。
题目是这样的,给你一个数字三角形,第一行1个数字,第二行3个数字,第 i i i行 2 ∗ i − 1 2*i-1 2∗i−1个数字,一共 n n n行。如下图所示,为3行的数字三角形,一开始从顶点出发,当位于某一点时可以往这个点的正下方走,也可以往左下方和右下方走。
例如在值为3的这一个点,可以往正下方走到7,也可以往左下方走到6,也可往右下方走到8(不能从3走到5或9)。
每走到一个位置就会取出当前所在位置的值,问从顶点走到最后一层,最终的往左下方和往右下方的次数之差的绝对值不能超过
k
k
k 次,所取的数值总和的最大值为多少。
输入描述:
第一行输入
n
,
k
,
1
≤
n
≤
300
,
0
≤
k
≤
300
,
k
≤
n
n,k,1\leq n\leq300, 0 \leq k\leq 300,k\leq n
n,k,1≤n≤300,0≤k≤300,k≤n
接下来输入
n
n
n行,第
i
i
i行共
2
∗
i
−
1
2*i-1
2∗i−1个值,对于每个值
x
,
−
2
∗
1
0
9
≤
x
≤
2
∗
1
0
9
x, -2*10^9\leq x\leq2*10^9
x,−2∗109≤x≤2∗109
输出描述:
输出从顶点到底部的获取总和的最大值
示例1
输入
3 1
1
2 3 4
5 6 7 8 9
输出
13
说明
第一次在值为1的点,第二次向右下方走到值为4,第三次从4这个点往正下方走到值为8的点,总和为13
import java.io.*;
import java.util.Arrays;
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));
long[][] dp = new long[310][610];
for (int i = 0; i <= 300; i++) {
Arrays.fill(dp[i], -100000000000000L);
}
String[] str = bf.readLine().split(" ");
int n = Integer.parseInt(str[0]);
int k = Integer.parseInt(str[1]);
for (int i = 1; i <= n; i++) {
str = bf.readLine().split(" ");
for (int l = 0, j = n - i + 1; j <= n + i - 1; l++, j++) {
dp[i][j] = Integer.parseInt(str[l]);
}
}
for (int i = 2; i <= n; i++)
for (int j = n - i + 1; j <= n + i - 1; j++) {
dp[i][j] += Math.max(dp[i - 1][j - 1], Math.max(dp[i - 1][j], dp[i - 1][j + 1]));
}
long ans = -100000000000000L;
for (int i = n - k; i <= n + k; i++) {
ans = Math.max(ans, dp[n][i]);
}
bw.write(ans + "\n");
bw.close();
}
}