Numero di sequenze quando nessun elemento adiacente può essere uguale

0

Mi sono imbattuto in questo problema,

There is a particular sequence only uses the numbers 1, 2, 3, 4 and no two adjacent numbers are the same. Write a program that given n1 1s, n2 2s, n3 3s, n4 4s will output the number of such sequences using all these numbers. Output your answer modulo 1000000007 (10^9 + 7).

Non riesco a capire la soluzione di questo. Sarà fatto con DP o qualche tipo di DFS con backtracking?

    
posta dharakk 09.11.2014 - 10:24
fonte

1 risposta

1

Se sono corretto, la soluzione di attraversamento del grafico è piuttosto semplice: puoi attraversare il grafico con la funzione ricorsiva memorizzando solo i simboli "di sinistra" e l'ultimo usato.

  1. lascia che ci sia una funzione f di input (coppie chiave-valore, dove le chiavi sono 1 .. 4 ; i valori sono n1 .. n4 ) e p - ultimo numero utilizzato e p inizialmente non definito
  2. in un ciclo, se input[i] > 0 e i != p , dove i è una chiave
    1. aggiungi 1 al risultato, perché hai trovato un'altra soluzione, 1 simbolo più lungo
    2. imposta inputUpd := input (copia per chiamata ricorsiva)
    3. decremento inputUpd[i] , perché abbiamo appena usato il simbolo i e ce n'è uno in meno di sinistra
    4. imposta p := i , perché abbiamo appena utilizzato i
    5. aggiungi il valore di f(inputUpd, p) (chiamata ricorsiva con input "minore" e ultimo simbolo usato) per ottenere

Non ho potuto aiutare me stesso, quindi ecco il codice in JS. Saltalo se vuoi capire da solo la soluzione.

function f(input, prev) {
  var acc = 0;
  for (i in input) {
    if (i != prev && input[i] > 0) {
      var inputUpd = {};
      for (j in input) {
        inputUpd[j] = (j == i) ? (input[j] - 1) : input[j];
      }
      acc += 1 + f(inputUpd, i);
    }
  }
  return acc;
}

f({'1': 1, '2': 1}) // -> 4: [1], [2], [1,2], [2,1]
f({'1': 1, '2': 2}) // -> 5: [1], [2], [1,2], [2,1], [2,1,2]
f({'1': 1, '2': 3}) // -> 5: same as before, but single '2' is leftover
f({'1': 1, '2': 1, '3': 2, '4': 2}) // -> 288
    
risposta data 09.11.2014 - 11:43
fonte