栄光のまだら光(問題の羅区P5638の問題解決、ピット抱擁のJava、C ++を破棄)

質問

P5638トピックのリンク

ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明
ここに画像を挿入説明

分析

Javaコードの最適化の2つのバージョン、すべてのT最後の5つのポイントを確認します。

初版は、プレフィックスと書き込みに:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt(), radius = scanner.nextInt();
        long[] sum_array = new long[num];
        for (int i = 0; i < num-1; i++) {
            sum_array[i+1] = sum_array[i] + scanner.nextLong();
        }
        scanner.close();
        long count = sum_array[radius];
        for(int i = 1; i < num-radius; i++) {
            count = Math.max(count, (sum_array[i+radius]-sum_array[i]));
        }
        System.out.println(sum_array[num-1]-count);
    }
}

ここに画像を挿入説明

有する第二版DPの書き込みに(説明首長を参照してください):

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
//        Scanner scanner = new Scanner(System.in);
//        int num = scanner.nextInt(), radius = scanner.nextInt();
//        long[] sum_array = new long[num];
//        for (int i = 0; i < num-1; i++) {
//            sum_array[i+1] = sum_array[i] + scanner.nextLong();
//        }
//        scanner.close();
//        long count = sum_array[radius];
//        for(int i = 1; i < num-radius; i++) {
//            count = Math.max(count, (sum_array[i+radius]-sum_array[i]));
//        }
//        System.out.println(sum_array[num-1]-count);
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt(), radius = scanner.nextInt();
        long[][] dp = new long[num+1][2];
        long[] array = new long[num];
        for (int i = 1; i < num; i++) {
            array[i] = scanner.nextLong();
        }
        scanner.close();
        for(int i = 2; i <= num;i++) {
            dp[i][0] = dp[i-1][0] + array[i-1];
            if(i > radius) {
                dp[i][1] = dp[i-radius][0];
            }
            dp[i][1] = Math.min(dp[i-1][1]+array[i-1], dp[i][1]);//状态转移方程
        }
        System.out.println(dp[num][1]);
    }
}

ここに画像を挿入説明

ACコード(C ++言語記述)

#include<bits/stdc++.h>
using namespace std;
long long sum_array[1000001];
long long num, radius;

int main() {
    cin >> num >> radius;
    for(int i = 0; i < num-1; i++) {
        long long x;
        cin>>x;
        sum_array[i+1] = sum_array[i] + x;
    }
    long long count = sum_array[radius];
    for(int i = 1; i < num - radius; i++) {
        count=max(count, sum_array[i + radius] - sum_array[i]);
    }
    cout << sum_array[num-1]-count << endl;
    return 0;
}
477元記事公開 ウォンの賞賛970 ビューに14万+を

おすすめ

転載: blog.csdn.net/weixin_43896318/article/details/104240545