Einführung in Algorithmen mit der Java-Shakutori-Methode

Artikelübersicht

Dies ist eine Reihe von Artikeln, die ich in meiner Studie und meinem Memo zusammengestellt habe. Die sechste Kugel. Klicken Sie hier für vorherige Artikel.

# Artikel
5 Einführung in Algorithmen mit Java-Kumulative Summe
4 Einführung in Algorithmen mit Java-Suche (Bit vollständige Suche)
3 Einführung in Algorithmen mit Java-Suche (Suche nach Breitenpriorität)
2 Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
1 Einführung in Algorithmen mit Java-Suche (vollständige Suche, dichotomisierte Suche)

In diesem Artikel

Ich werde darüber lernen. Mit kumulierter Summe? Wird es verwendet? Ich sehe sie oft als Set vorgestellt.

Shakutori-Methode

Wie die kumulative Summe scheint es eine Technik zu sein, Operationen auf einem Array von Zahlen zu beschleunigen.

Referenz: [[Kumulative Summe, Shakutori-Methode] Algorithmus-Illustration, die selbst Anfänger verstehen können](https://paiza.hatenablog.com/entry/2015/01/21/%E3%80%90%E7%B4%AF% E7% A9% 8D% E5% 92% 8C% E3% 80% 81% E3% 81% 97% E3% 82% 83% E3% 81% 8F% E3% 81% A8% E3% 82% 8A% E6% B3% 95% E3% 80% 91% E5% 88% 9D% E7% B4% 9A% E8% 80% 85% E3% 81% A7% E3% 82% 82% E8% A7% A3% E3% 82% 8B% E3% 82% A2% E3% 83% AB% E3% 82% B4)

Nun ... es ist ein bisschen verwirrend, wenn Sie sich den Link ansehen. .. .. Ich werde es für mein eigenes Studium erklären.

Betrachten Sie als Beispiel ein ganzzahliges Array der Größe n. Was ist der Maximalwert der Summe innerhalb dieses Abschnitts, wenn er von dort in die Länge t des angegebenen Abschnitts unterteilt wird? Es ist ein Problem, ein typisches Problem zu lösen. Es ist ein Problem, das mit der kumulierten Summe gelöst werden kann. Siehe auch den vorherigen Artikel (https://qiita.com/aja_min/items/3a334fb03749d8f42a25).

Betrachten Sie als Beispiel den Fall der Größe 5 (n = 5) und der Intervalllänge 2 (t = 2). スクリーンショット 2020-08-02 14.26.30.png

Betrachten Sie die Anordnung wie gezeigt. Wenn Sie dies durch die Länge von 2 des Abschnitts teilen, ist dies wie folgt.

スクリーンショット 2020-08-02 14.28.27.png

Aus der Schlussfolgerung ist 4 + 10 = 14 der Summe bei Auswahl des 4. und 5. der höchste Wert, aber wie hoch ist der Berechnungsbetrag bisher?

  1. Welchen Abschnitt auswählen?
  2. Berechnung der Summe innerhalb des Intervalls

Lassen Sie uns separat darüber nachdenken.

Zunächst einmal: 1. Wie teilt man den Abschnitt, nicht wahr? Im obigen Beispiel wird die Summe viermal genommen. Wenn Sie es in die Formel einfügen, ist es n-t + 1 Mal. Diesmal 5-2 + 1 = 4 mal.

Als nächstes folgt 2. Berechnung der Summe innerhalb dieses Intervalls, die zweimal verarbeitet wird, um auf jedes Element des Arrays zuzugreifen.

Im Allgemeinen ist es (n - t + 1) * t mal. Beachten Sie, dass, wenn t von n abhängt, der Berechnungsbetrag ungefähr O (n ^ 2) beträgt. In diesem Fall dauert es enorm lange, wenn n als 10 ^ 5 angenommen wird. In einem solchen Fall wird die Shakutori-Methode eingeführt.

Nun, es ist eine relativ einfache Geschichte ... Merken Sie sich die Summe, damit Sie nicht jedes Mal 1 hinzufügen müssen. darüber. Siehe die Abbildung unten.

スクリーンショット 2020-08-02 14.49.09.png

Verstehst du irgendwie Wenn Sie sich an die Summe erinnern, müssen Sie nicht alle Elemente t-mal gleichzeitig hinzufügen. Der Rechenaufwand beträgt n-t + 1-mal, da nicht mehr auf jedes Element des Arrays zugegriffen werden muss. Ich denke, es kann als O (n) ausgedrückt werden.

Gehen wir zum Beispiel.

Beispiel

Beispiel: AtCoder --abc032-c "column"

Klicken Sie hier, um Problemsätze und Eingabebeispiele anzuzeigen.
* Bitte beziehen Sie sich so weit wie möglich auf den Problemlink

(Abschnittsstart) 【Problemstellung】 Es gibt eine nicht negative ganzzahlige Folge S = s1, s2, ..., sN der Länge N und eine ganze Zahl K. Ihre Aufgabe ist es, die Länge des längsten zusammenhängenden Teilstrings von S zu ermitteln, der die folgenden Bedingungen erfüllt: Die Länge der Unterspalte muss 1 oder mehr betragen.

-Das Produkt der Werte aller in der Unterspalte enthaltenen Elemente ist K oder weniger.

Wenn keine Unterspalte vorhanden ist, die die Bedingungen erfüllt, geben Sie 0 aus.

【Eingang】 Die Eingabe erfolgt über die Standardeingabe im folgenden Format.

N K
s1 
s2
:
sN
  • In der ersten Zeile werden die Ganzzahl N (1 ≤ N ≤ 105), die die Länge der Zahlenspalte darstellt, und die Ganzzahl K (0 ≤ K ≤ 10 ^ 9) in der Problemstellung durch Leerzeichen getrennt angegeben. -Der Wert jedes Elements in der Zahlenspalte wird den N Zeilen aus der zweiten Zeile zugewiesen. Von diesen wird si (0 ≤ si ≤ 10 ^ 9) auf die Zeile i (1 ≤ i ≤ N) geschrieben.

【Ausgabe】 Die Ausgabe sollte eine Standardausgabe im folgenden Format sein. Geben Sie in der ersten Zeile die Länge der längsten fortlaufenden Unterspalte aus, in der das Produkt der Werte aller enthaltenen Elemente K oder weniger ist. Wenn kein Teilstring vorhanden ist, der die Bedingungen erfüllt, geben Sie 0 aus. Vergessen Sie nicht den letzten Zeilenumbruch.

(Ende des Abschnitts)


Das ist das Problem. Es ist ein wenig angewendet. Es ist im Grunde eine wackelige Methode, aber diesmal ist die Länge noch nicht festgelegt. Es wird gemäß der folgenden Richtlinie implementiert.

Unten finden Sie eine Beispielantwort.

Main.java


import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int n = sc.nextInt(); //Nicht negative Ganzzahlzeichenfolgenlänge
		long k = sc.nextLong(); //Maximales Produkt

		long[] s = new long[n]; //Nicht negative Ganzzahlzeichenfolge

		for (int i = 0; i < n; i++) {
			s[i] = sc.nextLong();
			if (s[i] == 0l) {
				System.out.println(n);
				return;
			}
		}

		long seki = 1; //Variablen, die das Produkt speichern
		int ans = 0; //Maximale Länge
		int ans_max = -1; //Speichern Sie die Antwort
		int left = 0; //Linkes Ende
		int right = 0; //Rechtes Ende

		for (left = 0; left < n; left++) {

			//Befestigen Sie das linke Ende und bewegen Sie das rechte Ende so weit wie möglich, um zu multiplizieren
			while (right < n && seki * s[right] <= k) {
				seki *= s[right++];
			}

			//Lagerung von maximal ans
			ans = right - left;
			if (ans_max < ans) {
				ans_max = ans;
			}

			//Bewegen Sie den linken Rand. links==Sei vorsichtig, wenn es richtig wird.
			if (left == right) {
				right++;
			} else {
				seki /= s[left];
			}

		}

		System.out.println(ans_max);
	}
}

Ja. Ich bezog mich auf verschiedene Quellen, aber es war ziemlich schwierig. .. Das Beispiel, in dem links mit rechts aufholt, war besonders schwierig. Dies scheint auch Übung zu erfordern. .. .. Lass uns gut üben. Ich werde die Quelle immer und immer wieder lesen.

wir sehen uns!

Recommended Posts

Einführung in Algorithmen mit der Java-Shakutori-Methode
Einführung in Algorithmen mit Java-Suche (Tiefenprioritätssuche)
Einführung in Algorithmen mit Java --Search (Breitenprioritätssuche)
Einführung in Algorithmen mit Java --Search (Bit Full Search)
Einführung in Algorithmen mit Java-Suche (Vollsuche, Halbierungssuche)
Einführung in Algorithmen mit Java-kumulativer Summe
Einführung in Entwurfsmuster (Factory-Methode)
[Java] Fassen Sie zusammen, wie Sie mit der Methode equals vergleichen können
Einführung in Ruby 2
Suchmethode
Einführung in web3j
Einführung in Micronaut 1 ~ Einführung ~
[Java] Einführung in Java
Einführung in die Migration
Einführung in Java
Einführung in Doma
Einführung in den Roboterkampf mit Robocode (Umgebungskonstruktion)
Überschreiben Sie die geschützte Methode mit anonymer Klasse und Stub
Einführung in den Roboterkampf mit Robocode (Anfängerentwicklung)
So vermeiden Sie Ausnahmen mit der Java-Methode equals
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Einführung in JAR-Dateien
[Einführung in Docker x ECS] ECS-Bereitstellung mit Docker Compose
Einführung in Ratpack (8) -Session
Einführung in Algorithmen mit Java-Dictionary Reihenfolge / Kombination verschiedener Lebensmittel (Teil1)
Einführung in die Bitarithmetik
Einführung in Ratpack (6) --Promise
Einführung in PlayFramework 2.7 ① Übersicht
Einführung in das Android-Layout
Einführung in Entwurfsmuster (Einführung)
Einführung in die praktische Programmierung
Einführung in den Befehl javadoc
Einführung in "Einführung in die praktische Rostprogrammierung" (Tag 3)
Einführung in den Befehl jar
Einführung in Ratpack (2) -Architektur
[Rails] entwickeln eine Einführungsmethode
Einführung in den Lambda-Stil
Einführung in den Java-Befehl
Einführung in die Keycloak-Entwicklung
16 Entspricht dem Methodenaufruf
Einführung in den Befehl javac
Ich war süchtig danach, default_url_options mit der Einführung von Rails zu setzen
Einführung in Entwurfsmuster (Builder)
Java zum Spielen mit Function
Einführung in die Android App-Entwicklung
Einführung in Metabase ~ Umgebungskonstruktion ~
Einführung in Ratpack (7) - Guice & Spring
(Punktinstallation) Einführung in Java8_Impression
Einführung in Entwurfsmuster (Composite)
Wie man ganze Zahlen mit Rubin überprüft
Einführung in Micronaut 2 ~ Unit Test ~