Ich hatte Array von ganzen Zahlen A [1 ... N]. Jetzt möchte ich ALLE LANGZEITIGES ABSTIEG SUBSEQUENCE drucken. Ich habe das meiste des Tutorials durchgegangen, aber alle Tutorials drucken nur ein LDS. Nehmen Sie an, die Länge von LDS ist 5, dann drucken die meisten nur ein LDS der Länge 5. Aber ich möchte alle möglichen LDS.Wie zu drucken tun dies? Kann es in O (nlongn) Zeit getan werden. Pseudocode wird hilfreicher sein.Drucken Sie alle möglichen Längste abnehmende Untersequenz
Antwort
Es ist einfacher, die Idee zu verstehen, wenn Sie un-Optimierer der Algorithmus von Ihrem Tutorial und ein verwenden einfacherer N^2
Algorithmus, der linear zurück sucht, anstatt in der Karte nachzuschlagen. Ändern Sie dann den Code, der die Sequenz druckt, um nach dem vorherigen Element rückwärts zu suchen, anstatt es in vector<int> pre
zu speichern. Dann könnten Sie alle Sequenzen mit einem einfachen rekursiven Backtracker drucken:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
void print_all(
const vector<int> seq
, const vector<int>& len
, int max, int pos
, vector<int>& sofar) {
if (max == 0) {
for (int i = sofar.size()-1 ; i >= 0 ; i--)
cout << sofar[i] << " ";
cout << endl;
return;
}
int val = pos < seq.size() ? seq[pos] : -1;
for (int i = pos-1 ; i >= 0 ; i--) {
if (len[i] == max && seq[i] > val) {
sofar.push_back(seq[i]);
print_all(seq, len, max-1, i, sofar);
sofar.erase(sofar.end()-1);
}
}
}
int main() {
int data[] = {5, 30, 2, 17, 92, 11, 7, 10, 2, 1};
vector<int> seq(data, data+10);
vector<int> len(seq.size());
for (int i = 0 ; i < seq.size() ; i++) {
len[i] = 1;
for (int j = i-1 ; j >= 0 ; j--)
if (seq[j] > seq[i] && len[j]+1 > len[i])
len[i] = len[j]+1;
}
int max = *max_element(len.begin(), len.end());
cerr << max << endl;
vector<int> sofar;
print_all(seq, len, max, seq.size(), sofar);
}
dasblinkenlight :: Das Programm gibt falsche Ausgabe für Falldaten [] = {5, 23, 100, 10, 4, 90, 65, 11, 18, 10} ist die Angabe LDS-Länge = 4 und LDS {90 65 18 10}, {90 65 11 10} Wie auch immer, die richtige Antwort ist LDS length = 5, und LDS sind {100 90 65 18 10}, {100 90 65 11 10} –
dasblinkenlight :: Das Programm gibt eine falsche Ausgabe für die Falldaten [] = {5, 23, 100, 10, 4, 90, 65, 1 1, 18, 10} gibt die LDS-Länge = 4, und LDS sind {90 65 18 10}, {90 65 11 10} Wie auch immer die richtige Antwort ist LDS-Länge = 5, und LDS sind {100 90 65 18 10} , {100 90 65 11 10} –
dasblinkenlight :: Sie können es hier überprüfen :: http://ideone.com/SP4wc –
können Sie behalten den Überblick über Ihre längste (bisher) Teilfolgen, wie Sie gehen:
// If you have only one element, that is the longest descending subsequence
// Otherwise store first element as previous
if: current element is less than (or equal to) previous
// decreasing
increase current subsequence length
add element to current subsequence
else:
// increasing
set current subsequence length to 0
empty current subsequence
if: current subsequence is longer than current maximum
invalidate all current max subsequences
set current maximum subsequence length to current subsequence length
add current subsequence to set of longest subsequences
else if: current subsequence is same size as current maximum
add current subsequence to set of longest subsequences
- 1. Längste Erhöhung der Untersequenz-Optimierung
- 2. Längste steigende Untersequenz von jedem Element
- 3. drucken alle möglichen Kombinationen mit Zahlen
- 4. Generieren Sie alle möglichen Ersetzungen
- 5. So suchen Sie als Untersequenz
- 6. Generieren Sie alle möglichen Permutationen einer Klasse
- 7. Erhalten Sie alle möglichen verfügbaren Währungen
- 8. Generieren Sie alle möglichen Permutationen in C
- 9. Erhalten Sie alle möglichen Teilstring in PHP
- 10. Alle möglichen Wertekombinationen erhalten
- 11. alle möglichen Phasen Kombination
- 12. Wie längste eingeschränkt Teilfolge
- 13. Makefile - Build alle möglichen Ziele
- 14. Container-Vorlagenklasse - abnehmende Behältergröße
- 15. PHP-Ausgabe alle möglichen Zahlenkombinationen
- 16. Finden der längsten zusammenhängenden Untersequenz in einem Array
- 17. Prolog: Erhalte alle möglichen Werte einer Variablen
- 18. Alle möglichen Permutationen aller möglichen Größen in Java
- 19. Finde alle möglichen Wege durch ein Labyrinth
- 20. Finden Sie alle möglichen Teilstrings beginnend mit Zeichen aus der Erfassungsgruppe
- 21. Finden der längsten ähnlichen Untersequenz in einer Zeichenkette
- 22. Dijkstra-Algorithmus findet alle möglichen kürzesten Wege
- 23. Minimaler Münzwechsel Alle Kombinationen drucken
- 24. Zunehmende/abnehmende Geschwindigkeit des Quadrats
- 25. Alle möglichen Kombinationen von Elementen einer Liste
- 26. Drucken Sie alle Permutationen mit Rekursion
- 27. Erstellen Sie alle möglichen Korrelationsmatrizen für 3 Variablen
- 28. Reisen Verkäufer: Erhalten Sie alle möglichen Pfade mit Rekursion
- 29. Java Finden Sie alle möglichen Kombinationen aus Spalten
- 30. Berechnen Sie alle möglichen Paare von Artikeln aus zwei Listen?
Welches Tutorial? Mit was bist du bisher gekommen? Irgendein Code, wo Sie eine bestimmte Frage haben? – Femaref
Versuchen Sie, sich Gedanken über die zu verwendende Datenstruktur zu machen, geben Sie einen Beispielcode ein, zeigen Sie, was Sie ausprobiert haben, usw. _TRIE_ – Baz1nga
@Femaref: https: //comeoncodeon.wordpress.com/2009/08/12/longest-increasing-subsequence-lis/this what i refered.This ist obwohl LIS, aber das wird nicht viel. Es druckt nur die LETZTE LDS, wenn Multiples exits.I möchte alle LDS –