循环实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
final int N = 310, INF = Integer.MAX_VALUE;
int[] s = new int[N];
int[][] f = new int[N][N];
int n;
public Main() throws IOException {
n = Integer.parseInt(in.readLine());
String[] line = in.readLine().split(" ");
for (int i = 1; i <= n; i++) {
s[i] = Integer.parseInt(line[i - 1]);
s[i] += s[i - 1]; // 前缀和
}
for (int len = 2; len <= n; len++) {
for (int l = 1; l + len - 1 <= n; l++) {
int r = l + len - 1;
f[l][r] = INF;
for (int k = l; k < r; k++) {
f[l][r] = Math.min(f[l][r], f[l][k] + f[k + 1][r] + s[r] - s[l - 1]);
}
}
}
System.out.println(f[1][n]);
in.close();
}
public static void main(String[] args) throws Exception {
new Main();
}
}
记忆化搜索
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
final int N = 310, INF = Integer.MAX_VALUE;
int[] s = new int[N];
int[][] f = new int[N][N];
int n;
int dp(int l, int r) {
if(f[l][r] != -1)
return f[l][r];
if(l == r)
return 0;
f[l][r] = INF;
for (int i = l; i < r; i++) {
f[l][r] = Math.min(f[l][r], dp(l, i) + dp(i + 1, r) + s[r] - s[l - 1]);
}
return f[l][r];
}
public Main() throws IOException {
n = Integer.parseInt(in.readLine());
String[] line = in.readLine().split(" ");
for (int i = 1; i <= n; i++) {
s[i] = Integer.parseInt(line[i - 1]);
s[i] += s[i - 1]; // 前缀和
}
for (int i = 1; i <= n; i++) {
Arrays.fill(f[i], 1, n + 1, -1);
}
System.out.println(dp(1, n));
in.close();
}
public static void main(String[] args) throws Exception {
new Main();
}
}