本人喜欢使用Java刷题,但是洛谷这个平台不知道是怎么判断Java的内存开销的,同样的程序一会儿能过,一会儿不能过,甚至我自己感觉把内存优化了一下,开销反而更大了,完全不明白,希望有大佬讲解一下。不能过的代码都是提示MLE错误。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] price = new int[N][3];
for(int i = 0; i < N; i++) {
price[i][0] = sc.nextInt();
price[i][1] = sc.nextInt();
price[i][2] = sc.nextInt();
}
int ans = 0;
for(int i = 0; i < 3; i++) {
int[][][] dp = new int[N + 1][3][2];
dp[0][i][0] = dp[0][i][1] = price[0][i];
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
if(j > k) {
dp[1][j][1] = Math.max(dp[1][j][1], dp[0][k][0] + price[1][j]);
} else if(j < k) {
dp[1][j][0] = Math.max(dp[1][j][0], dp[0][k][1] + price[1][j]);
}
}
}
for(int j = 2; j < N - 1; j++) {
for(int k = 0; k < 3; k++) {
for(int m = 0; m < 3; m++) {
if(k > m) {
dp[j][k][1] = Math.max(dp[j][k][1], dp[j - 1][m][0] + price[j][k]);
} else if(k < m) {
dp[j][k][0] = Math.max(dp[j][k][0], dp[j - 1][m][1] + price[j][k]);
}
}
}
}
for(int j = 0; j < 3; j++) {
if(j < i) {
for(int m = j + 1; m < 3; m++) {
dp[N - 1][j][0] = Math.max(dp[N - 1][j][0], dp[N - 2][m][1] + price[N - 1][j]);
}
} else if(j > i) {
for(int m = 0; m < j; m++) {
dp[N - 1][j][1] = Math.max(dp[N - 1][j][1], dp[N - 2][m][0] + price[N - 1][j]);
}
}
}
for(int j = 0; j < 3; j++) {
ans = Math.max(ans, dp[N - 1][j][0]);
ans = Math.max(ans, dp[N - 1][j][1]);
}
}
System.out.println(ans);
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] price = new int[N][3];
int[][][] dp = new int[2][3][2];
for(int i = 0; i < N; i++) {
price[i][0] = sc.nextInt();
price[i][1] = sc.nextInt();
price[i][2] = sc.nextInt();
}
int ans = 0;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 2; k++) {
dp[0][j][k] = dp[1][j][k] = 0;
}
}
dp[0][i][0] = dp[0][i][1] = price[0][i];
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
if(j > k) {
dp[1][j][1] = Math.max(dp[1][j][1], dp[0][k][0] + price[1][j]);
} else if(j < k) {
dp[1][j][0] = Math.max(dp[1][j][0], dp[0][k][1] + price[1][j]);
}
}
}
transfer(dp);
for(int j = 2; j < N - 1; j++) {
for(int k = 0; k < 3; k++) {
for(int m = 0; m < 3; m++) {
if(k > m) {
dp[1][k][1] = Math.max(dp[1][k][1], dp[0][m][0] + price[j][k]);
} else if(k < m) {
dp[1][k][0] = Math.max(dp[1][k][0], dp[0][m][1] + price[j][k]);
}
}
}
transfer(dp);
}
for(int j = 0; j < 3; j++) {
if(j < i) {
for(int m = j + 1; m < 3; m++) {
dp[1][j][0] = Math.max(dp[1][j][0], dp[0][m][1] + price[N - 1][j]);
}
} else if(j > i) {
for(int m = 0; m < j; m++) {
dp[1][j][1] = Math.max(dp[1][j][1], dp[0][m][0] + price[N - 1][j]);
}
}
}
for(int j = 0; j < 3; j++) {
ans = Math.max(ans, dp[1][j][0]);
ans = Math.max(ans, dp[1][j][1]);
}
}
System.out.println(ans);
}
private static void transfer(int[][][] dp) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 2; k++) {
dp[0][j][k] = dp[1][j][k];
dp[1][j][k] = 0;
}
}
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[][] price = new int[N + 1][3];
int[][][] dp = new int[N + 1][3][2];
for(int i = 0; i < N; i++) {
price[i][0] = sc.nextInt();
price[i][1] = sc.nextInt();
price[i][2] = sc.nextInt();
}
int ans = 0;
for(int i = 0; i < 3; i++) {
reset(dp, 0);
reset(dp, 1);
dp[0][i][0] = dp[0][i][1] = price[0][i];
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
if(j > k) {
dp[1][j][1] = Math.max(dp[1][j][1], dp[0][k][0] + price[1][j]);
} else if(j < k) {
dp[1][j][0] = Math.max(dp[1][j][0], dp[0][k][1] + price[1][j]);
}
}
}
for(int j = 2; j < N - 1; j++) {
reset(dp, j);
for(int k = 0; k < 3; k++) {
for(int m = 0; m < 3; m++) {
if(k > m) {
dp[j][k][1] = Math.max(dp[j][k][1], dp[j - 1][m][0] + price[j][k]);
} else if(k < m) {
dp[j][k][0] = Math.max(dp[j][k][0], dp[j - 1][m][1] + price[j][k]);
}
}
}
}
for(int j = 0; j < 3; j++) {
if(j < i) {
for(int m = j + 1; m < 3; m++) {
dp[N - 1][j][0] = Math.max(dp[N - 1][j][0], dp[N - 2][m][1] + price[N - 1][j]);
}
} else if(j > i) {
for(int m = 0; m < j; m++) {
dp[N - 1][j][1] = Math.max(dp[N - 1][j][1], dp[N - 2][m][0] + price[N - 1][j]);
}
}
}
for(int j = 0; j < 3; j++) {
ans = Math.max(ans, dp[N - 1][j][0]);
ans = Math.max(ans, dp[N - 1][j][1]);
}
}
System.out.println(ans);
}
private static void reset(int[][][] dp, int i) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 2; k++) {
dp[i][j][k] = 0;
}
}
}
}
import java.util.Scanner;
public class Main {
private static int[][] price = new int[100001][3];
private static int[][][] dp = new int[100001][3][2];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for(int i = 0; i < N; i++) {
price[i][0] = sc.nextInt();
price[i][1] = sc.nextInt();
price[i][2] = sc.nextInt();
}
int ans = 0;
for(int i = 0; i < 3; i++) {
reset(dp, 0);
reset(dp, 1);
dp[0][i][0] = dp[0][i][1] = price[0][i];
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 3; k++) {
if(j > k) {
dp[1][j][1] = Math.max(dp[1][j][1], dp[0][k][0] + price[1][j]);
} else if(j < k) {
dp[1][j][0] = Math.max(dp[1][j][0], dp[0][k][1] + price[1][j]);
}
}
}
for(int j = 2; j < N - 1; j++) {
reset(dp, j);
for(int k = 0; k < 3; k++) {
for(int m = 0; m < 3; m++) {
if(k > m) {
dp[j][k][1] = Math.max(dp[j][k][1], dp[j - 1][m][0] + price[j][k]);
} else if(k < m) {
dp[j][k][0] = Math.max(dp[j][k][0], dp[j - 1][m][1] + price[j][k]);
}
}
}
}
for(int j = 0; j < 3; j++) {
if(j < i) {
for(int m = j + 1; m < 3; m++) {
dp[N - 1][j][0] = Math.max(dp[N - 1][j][0], dp[N - 2][m][1] + price[N - 1][j]);
}
} else if(j > i) {
for(int m = 0; m < j; m++) {
dp[N - 1][j][1] = Math.max(dp[N - 1][j][1], dp[N - 2][m][0] + price[N - 1][j]);
}
}
}
for(int j = 0; j < 3; j++) {
ans = Math.max(ans, dp[N - 1][j][0]);
ans = Math.max(ans, dp[N - 1][j][1]);
}
}
System.out.println(ans);
}
private static void reset(int[][][] dp, int i) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 2; k++) {
dp[i][j][k] = 0;
}
}
}
}