C++
 Computer >> コンピューター >  >> プログラミング >> C++

デラノイ数とは?C++でデラノイ数を求めるプログラムの作成方法

デラノイ数(Delannoy Number)とは

デラノイ数 D とは、長方形のグリッド上において、南西の角 (0,0) から北東の角 (a,b) まで移動する経路の総数を表す数です。ただし、移動に使用できるのは以下の3種類のステップのみとします。

  • 東方向への移動(→)
  • 北東方向への移動(↗)
  • 北方向への移動(↑)

この定義から、デラノイ数は次の漸化式で表すことができます。

D(a,b) = D(a-1, b) + D(a, b-1) + D(a-1, b-1) ※ただし D(0,0) = 1

例えば、デラノイ数 D(3,3) の値は 63 になります。

デラノイ数を求めるアルゴリズム

デラノイ数を計算する手順は以下の通りです。

  1. 2つの座標 (a, b) を入力として受け取ります。
  2. 座標 a と b を引数にとる整数型関数 generateDelannoy(int a, int b) を定義します。
  3. ベースケースとして、座標 a または b のどちらかが 0 の場合には 1 を返します。
  4. それ以外の場合は、漸化式 D(a-1,b) + D(a,b-1) + D(a-1,b-1) を用いて再帰的にデラノイ数を生成し、その結果を返します。

C++による実装例

#include<iostream>
using namespace std;

int generateDelannoy(int a, int b){
    int d = 1;
    if((a == 0) || (b == 0)){
        d = 1;
    } else {
        d = generateDelannoy(a-1, b) + generateDelannoy(a, b-1) + generateDelannoy(a-1, b-1);
    }
    return d;
}

int main(){
    int a = 3;
    int b = 3;
    int result = 0;
    result = generateDelannoy(a, b);
    cout << result << endl;
}

実行結果

上記のコードを実行すると、次の出力が得られます。

63

与えられた座標 (a,b) = (3,3) に対して、漸化式 D(a-1,b) + D(a,b-1) + D(a-1,b-1) を用いて再帰的に計算を行うことで、デラノイ数「63」が出力されます。

補足:計算量について

この再帰的な実装はシンプルで理解しやすい反面、同じ引数に対する計算が何度も繰り返されるため、指数的な時間計算量となります。a や b が大きくなる場合は、メモ化(動的計画法)を組み合わせることで O(a×b) まで計算量を抑えることが可能です。

  1. 盗まれたキーボードの最小台数を求めるC++プログラム

    問題概要 n個の要素を持つ配列Aがあるとします。ある電器店で昨夜、強盗事件が発生しました。店内にあったすべてのキーボードには、ある整数xから始まる連番が振られていました。例えば、x=4で店に3台のキーボードがあれば、それらの番号は4、5、6です。また、x=10で7台あれば、番号は10、11、12、13、14、15、16となります。強盗の後、n台のキーボードだけが残り、その番号が配列Aに格納されています。ここで、盗まれたキーボードの最小台数を求めることが課題です。 例えば、入力が A = [10, 13, 12, 8] の場合、出力は 2 になります。これは x = 8 のとき、盗まれたキーボー

  2. グリッド内で照らされているセルの数を求めるC++プログラム

    問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb