计算建造建筑物的可能方式

dynamic programmingalgorithmsdata structure

这里给出了 n 个路段,每个路段中,道路上有两边可以建造建筑物。如果两栋房子之间需要有一个空地,那么在该地块中有多少种建造建筑物的可能方式。

建造建筑物有四种可能

  •  道路的一侧
  •  道路的另一侧
  •  无法建造任何建筑物
  •  道路的两侧

输入和输出

输入:
建造建筑物需要路段数。假设输入为 3。
输出:
输入路段数:3
建筑物可以用 25 种不同的方式建造。

算法

constructionWays(n)

输入: 有 n 个部分。

输出 − 可能的方法数。

开始
   如果 n = 1,则
      返回 4
   countEnd := 1
   countEndSpace := 1

   对于 i := 2 到 n,执行
      prevCountEnd := countEnd
      prevCountEndSpace := countEndSpace
      countEndSpace := countEnd + prevCountEndSpace
      countEnd := prevCountEndSpace
   done

   answer := countEndSpace + countEnd
   return answer^2
End

示例

#include<iostream>
using namespace std;

int constructionWays(int n) {
   if (n == 1)        //如果有一个部分
      return 4;       //在该部分建造建筑物的 4 种可能方法

   //设置末尾位置的计数值并以空间结尾
   int countEnd=1, countEndSpace=1, prevCountEnd, prevCountEndSpace;

   for (int i=2; i<=n; i++) {       //从第二部分到第 n 部分
      prevCountEnd = countEnd;
      prevCountEndSpace = countEndSpace;

      countEndSpace = countEnd + prevCountEndSpace;
      countEnd = prevCountEndSpace;
   }

   //可能以空间结尾并在末尾建造建筑物的方式
   int answer = countEndSpace + countEnd;

   return (answer*answer);     //对于两边,答案将是平方
}

int main() {
   int n;
   cout << "输入部分数:";
   cin >> n;
   cout << "建筑物可以用<<< constructionWays(n) <<" 多种不同方式建造。" ;
}

输出

输入部分数:3
建筑物可以用 25 种不同的方式建造。

相关文章