Het is niet nodig om de gehele matrix op te slaan, omdat de kolommen en rijen met dezelfde index dezelfde waarden hebben.
Ik ga er vanuit dat je de geposte matrix probeert in te lezen. In dat geval moet je nu eenmalig de rijen of kolommen inlezen. De rijen is makkelijker, omdat iedere regel één unieke sleutel bevat en zijn bijbehorende waardes.
Of je nou de combinatie AR of RA opslaat, het resultaat is hetzelfde, namelijk -2.
PHP-code:
private Map<Tuple<Character>, Integer> values = new HashMap<Tuple<Character>, Integer>();
De Map waarin alles opgeslagen wordt. De sleutel is een letterpaar en de waarde is de bijbehorende waarde uit jouw matrix.
Even wat grove pseudocode, alles is 0-based:
PHP-code:
//Ga over de regels 0 tot en met n. regelNr = huidige regelnummer. Regel 0 heeft key A, regel 1 heeft key R, etc..
Character lineKey;
//Ga per regel over de kolommen (23 - regelNr) tot en met het einde. De eerste paar kolommen hoeven niet, want van alles daarvoor heb je de inverse al gehad. Kolom 0 heeft key A, etc.
Character columnKey;
Integer value; //Deze veranderd per kolom
values.put(new Tuple<Character>(lineKey, columnKey), value); //Voeg toe aan de map
Je hebt nu je twee sequenties die je moet vergelijken. Als de combinatie die je zoekt niet bestaat, moet je de inverse even proberen.
Ik neem aan dat de sequenties even lang zijn en dat de matrix altijd is zoals jij 'm gepost hebt.
PHP-code:
int score = 0;
for(int i = 0; i < sequence1.length(); i++) {
Tuple<Character> key = new Tuple<Character>(sequence1.charAt(i), sequence2.charAt(i));
if(values.contains(key)) {
score += values.get(key).intValue();
} else {
score += values.get(key.inverse()).intValue();
}
}
De Tuple class:
PHP-code:
public class Tuple<T> {
private T first;
private T second;
public Tuple(T firstEl, T secondEl) {
first = firstEl;
second = secondEl;
}
public Tuple<T> inverse() {
return new Tuple<T>(second, first);
}
public T firstElement() {
return first;
}
public T secondElement() {
return second;
}
}