デラノイ数とは?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 になります。
デラノイ数を求めるアルゴリズム
デラノイ数を計算する手順は以下の通りです。
- 2つの座標 (a, b) を入力として受け取ります。
- 座標 a と b を引数にとる整数型関数 generateDelannoy(int a, int b) を定義します。
- ベースケースとして、座標 a または b のどちらかが 0 の場合には 1 を返します。
- それ以外の場合は、漸化式 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) まで計算量を抑えることが可能です。
-
盗まれたキーボードの最小台数を求める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 のとき、盗まれたキーボー
-
グリッド内で照らされているセルの数を求めるC++プログラム
問題の概要 ここでは、縦 h × 横 w のサイズを持つグリッドが与えられたとき、光で照らされているセルの数を求めるC++プログラムを紹介します。グリッドのセルには「電球」または「障害物」が置かれています。電球のあるセルは、そのセル自身と上下左右のセルを照らし、光は障害物に遮られない限りまっすぐ伝わっていきます。一方、障害物のあるセルは照らされることがなく、電球の光を遮って他のセルへ光が届かないようにします。電球の位置を配列 bulb、障害物の位置を配列 obstacles として受け取り、グリッド全体で照らされているセルの合計数を求めます。 たとえば、入力が h = 4、w = 4、bulb