Baek Junアルゴリズム9461号:波の半数列


質問リンク


https://www.acmicpc.net/problem/9461

質問する


右図に示すように、三角形は螺旋状に並んでいます.最初の三角形は正の三角形で、辺の長さは1です.次に、次の手順で正三角形を追加します.スパイラル上の最長エッジの長さがkの場合、そのエッジにkの長さの正三角形を追加します.
波数の半数列P(N)は螺旋上の正三角形の辺の長さである.P(1)からP(10)までの最初の10の数字は、1、1、2、2、3、4、5、7、9である.
Nが与えられた場合、P(N)を求めるプログラムを作成してください.

入力


第1行は、試験例の個数Tを与える.各試験例は1行からなり、Nが与えられる.(1 ≤ N ≤ 100)

しゅつりょく


各テストボックスはP(N)を出力する.

入力と出力の例



に答える


  • 宣言入力試験用例の個数tとN(1≦N≦100)

  • long資料型のdp配列にsizeに等しい空間を割り当てる.

  • 問題ではNの値が1〜9であるため,dp配列に値を格納する.(配列のインデックス値は0から始まるので、0から8に割り当てられます.)

  • N=1から9までのP(N)値から点火式を求める.
    dp[n−1]=dp[n−2]+dp[n−6]が求められる.
  • ソースコード

    #include <stdio.h>
    #define size 101
    
    long dp[size];
    
    int main(){
      int t = 0;
      dp[0] = dp[1] = dp[2] = 1;
      dp[3] = dp[4] = 2;
      dp[5] = 3;
      dp[6] = 4;
      dp[7] = 5;
      dp[8] = 7;
      scanf("%d",&t);
      for(int i = 10; i <= size; i++){
        dp[i - 1] = dp[i - 2] + dp[i - 6];
      }
      for(int i = 0; i < t; i++){
        int n = 0;
        scanf("%d",&n);
        printf("%ld\n",dp[n - 1]);
      }
      return 0;
    }

    アルゴリズム分類

  • 動的プログラミング