Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 2) Méthode de planification dynamique

introduction

Ce thème

AtCoder Beginner Contest 129 C - Typical Stairs Difficulty: 795

C'est là que la méthode de planification dynamique trouvée dans * Éditorial officiel * entre en jeu.

ruby.rb


n, m = gets.split.map(&:to_i)
MOD = 1_000_000_007
dp = Array.new(n + 2, 0)
a = []
dp[0] = 1
m.times do |i|
  a[i] = gets.to_i
  dp[a[i]] = -1
end
n.times do |i|
  next if dp[i] == -1
  if dp[i + 1] != -1
    dp[i + 1] += dp[i]
    dp[i + 1] %= MOD
  end
  if dp[i + 2] != -1
    dp[i + 2] += dp[i]
    dp[i + 2] %= MOD
  end
end
puts dp[n]

array.rb


  oks[a]=false;  # =>Disposition des planchers cassés

  dp[a[i]] = -1  # =>Plancher cassé-1

L'éditorial officiel fournit un tableau pour les sols cassés, mais pour l'instant, nous allons l'intégrer dans le tableau DP. Dans le type de montre illustré ci-dessous, la partie ** - 1 ** est le plancher cassé. 20200422.png Lorsque vous exécutez le débogage avec VSCode, etc., l'intérieur du tableau DP est affiché dans des variables et des expressions de surveillance, afin que vous puissiez vérifier comment la valeur numérique change et comment ignorer le plancher cassé.

version fib.rb


  if a[i] - a[i - 1] == 1
    puts "0"
    exit
  end

La version de planification dynamique de la source n'a pas la partie de la version de Fibonacci qui détermine si le plancher rompu est continu. Non, mais s'il y a une série de planchers cassés, il renvoie correctement ** 0 **.

De plus, il est facile de répondre à des changements de conditions comme le fait de pouvoir monter trois marches.

La méthode de planification dynamique est incroyable. Perl

perl.pl


chomp (my ($n, $m) = split / /, <STDIN>);
my $MOD = 1e9 + 7;
my (@a, @dp);
$dp[0] = 1;
for my $i (1..$m) {
  chomp (my $in = <STDIN>);
  $a[$i] = $in;
  $dp[$a[$i]] = -1;
}
for my $i (0..$n - 1) {
  next if $dp[$i] == -1;
  if ($dp[$i + 1] != -1) {
    $dp[$i + 1] += $dp[$i];
    $dp[$i + 1] %= $MOD;
  }
  if ($dp[$i + 2] != -1) {
    $dp[$i + 2] += $dp[$i];
    $dp[$i + 2] %= $MOD;
  }
}
print $dp[$n] + 0, "\n";

java.java


import java.util.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = Integer.parseInt(sc.next());
        int m = Integer.parseInt(sc.next());
        int MOD = 1_000_000_007;
        int a[] = new int[m];
        int dp[] = new int[n + 2];
        dp[0] = 1;
        for (int i = 0; i < m; i++) {
            a[i] = Integer.parseInt(sc.next());
            dp[a[i]] = -1;
        }
        sc.close();
        for (int i = 0; i < n; i++) {
            if (dp[i] == -1) {
                continue;
            }
            if (dp[i + 1] != -1) {
                dp[i + 1] += dp[i];
                dp[i + 1] %= MOD;
            }
            if (dp[i + 2] != -1) {
                dp[i + 2] += dp[i];
                dp[i + 2] %= MOD;
            }
        }
        System.out.print(dp[n]);
    }
}

Cette fois, c'est un ajout, donc c'est AC </ font> sans utiliser long.

Ruby Perl Java
Longueur du code 359 Byte 436 Byte 902 Byte
Temps d'exécution 64 ms 83 ms 347 ms
Mémoire 3912 KB 12288 KB 44684 KB

Résumé

  • ABC 129 C a été résolu avec difficulté
  • Familiarisez-vous avec Ruby
  • Familiarisez-vous avec Perl
  • Familiarisez-vous avec Java
  • Se familiariser avec la planification dynamique

Site référencé

Recommended Posts

Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 2) Méthode de planification dynamique
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 1)
Résolution avec Ruby, Perl et Java AtCoder ABC 128 C
Résolution avec Ruby, Perl et Java AtCoder ABC 113 C Reference
Recherche de priorité de largeur AtCoder ABC 136 D résolue en Ruby, Perl et Java
Tableau 2D AtCoder ABC129 D résolu en Ruby et Java
Tri par hachage AtCoder ABC 111 C résolu en Ruby, Perl et Java
Concours de programmation AtCoder dwango B à résoudre en Ruby, Perl et Java
Crypter avec Java et décrypter avec C #
Résolution avec Ruby AtCoder ACL Débutant Contest C Union Find (DSU)
Résolution avec Ruby AtCoder ABC177 D Union Find
Lier le code Java et C ++ avec SWIG
Résoudre le problème du sac à dos avec une planification dynamique
Résoudre la moyenne multiset ARC104 D avec Scala, Java, C ++, Ruby, Perl, Elixir
AtCoder Beginner Contest 169 A, B, C avec rubis
J'ai essayé d'implémenter Ruby avec Ruby (et C) (j'ai joué avec intégré)
Essayez d'intégrer Ruby et Java avec Dapr
JSON avec Java et Jackson Part 2 XSS mesures
AtCoder ABC127 D hash à résoudre avec Ruby 2.7.1
Problème atcoder ABC113 C
problème atcoder ABC115 C
Kotlin post- et pré-incrémentation et surcharge des opérateurs (comparaison avec C, Java, C ++)
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
ABC177-Résoudre E avec Ruby
Java et Iterator Part 1 External Iterator Edition
Apache Hadoop et Java 9 (partie 1)
Extension Ruby C et volatile
Histoire de remplacement C # et Java
Résolution avec Ruby AtCoder 1er test pratique de l'algorithme Une gestion des exceptions