洛谷平台怎么计算程序使用的内存
查看原帖
洛谷平台怎么计算程序使用的内存
687081
huaqiao楼主2024/6/22 10:48

本人喜欢使用Java刷题,但是洛谷这个平台不知道是怎么判断Java的内存开销的,同样的程序一会儿能过,一会儿不能过,甚至我自己感觉把内存优化了一下,开销反而更大了,完全不明白,希望有大佬讲解一下。不能过的代码都是提示MLE错误。

1.能过的代码

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);
    }
}

不能过的代码1

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;
            }
        }
    }
}

不能过的代码2

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;
            }
        }
    }
}

不能过的代码3

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;
            }
        }
    }
}
2024/6/22 10:48
加载中...