首先感谢y总:AcWing
如有侵权,请私聊,必删!
现在还没有理解线性dp的真正含义,先插个眼,后面补充
线性dp
前言
本篇主要是作者学习线性dp的一些心得记录,如果有错误的地方,多谢指正!
一、线性dp是什么?
线性dp往往指在一个序列上进行的dp,当然也可能有两个甚至多个序列。一般来讲,线性dp的三个步骤分别有以下特点:
- 设计状态:至少有一维表示当前考虑的对象在数列上的位置。
- 状态转移:必须找到这条线上前面的位置的dp值来推出当前位置的dp值。
- 边界条件:第一个位置单独讨论。
二、相关题目
1.数字三角形
题目:

代码:
import java.io.*;
public class Main {
private static int res;
private static int n, m, t, k, r, l, a, b, c, x, y;
private static String[] arrTemp;
private static final int N = 510;
private static int[][] q = new int[N][N];
private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
private static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
n = Integer.parseInt(in.readLine());
for (int i = 1; i <= n; i++) {
arrTemp = in.readLine().split(" ");
for (int j = 1; j <= i; j++)
q[i][j] = Integer.parseInt(arrTemp[j - 1]);
}
for (int i = n - 1; i >= 1; i--)
for (int j = 1; j <= i; j++)
q[i][j] = Math.max(q[i + 1][j], q[i + 1][j + 1]) + q[i][j];
out.write(q[1][1]+"");
in.close();
out.close();
}
}
思路:q[i][j] = Math.max(q[i + 1][j], q[i + 1][j + 1]) + q[i][j];
对线性dp理解不大
2.摘花生
题目:


代码:
import java.io.*;
public class Main {
private static int res;
private static int n, m, t, k, r, l, a, b, c, x;
private static String[] arrTemp;
private static final int N = 110;
private static int[][] g = new int[N][N];
private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
private static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(in.readLine());
while (T-- > 0) {
arrTemp = in.readLine().split(" ");
r = Integer.parseInt(arrTemp[0]);
c = Integer.parseInt(arrTemp[1]);
for (int i = 1; i <= r; i++) {
arrTemp = in.readLine().split(" ");
for (int j = 1; j <= c; j++)
g[i][j] = Integer.parseInt(arrTemp[j - 1]);
}
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
g[i][j] += Math.max(g[i - 1][j], g[i][j - 1]);
out.write(g[r][c] + "");
out.newLine();
}
in.close();
out.close();
}
}
思路:g[i][j] += Math.max(g[i - 1][j], g[i][j - 1]);
心得:
没啥心得
3.最低通行费
题目:


代码:
import java.io.*;
public class Main {
private static int res;
private static int n, m, t, k, r, l, a, b, c, x, y;
private static String[] arrTemp;
private static final int N = 110;
private static int[][] g = new int[N][N];
private static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
private static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
n = Integer.parseInt(in.readLine());
for (int i = 1; i <= n; i++) {
arrTemp = in.readLine().split(" ");
for (int j = 1; j <= n; j++)
g[i][j] = Integer.parseInt(arrTemp[j - 1]);
}
// 初始化第一行和第一列的数据
for (int i = 1; i <= n; i++) {
g[i][1] += g[i - 1][1];
g[1][i] += g[1][i - 1];
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
g[i][j] += Math.min(g[i - 1][j], g[i][j - 1]);
out.write(g[n][n] + "");
in.close();
out.close();
}
}
思路:g[i][j] += Math.min(g[i - 1][j], g[i][j - 1]);
注意初始化第一行和第一列的数据, 因为静态变量默认为0,数据范围0~100,取min会取0
心得:
x.xxxx
题目:
代码:
在这里插入代码片
1014

被折叠的 条评论
为什么被折叠?



