36.牛牛学数列6

60 阅读1分钟

链接:ac.nowcoder.com/acm/problem…
来源:牛客网

题目描述

有一个数列

已知

A1=0A_1=0A1​=0

A2=1A_2=1A2​=1

A3=1A_3=1A3​=1

A4=A1+2∗A2+A3A_4=A_1+2*A_2+A_3A4​=A1​+2∗A2​+A3​

A5=A2+2∗A3+A4A_5=A_2+2*A_3+A_4A5​=A2​+2∗A3​+A4​

......

求AnA_nAn​

输入描述:

输入一个整数n (1≤n≤201 \le n \le 201≤n≤20)

输出描述:

输出一个整数

示例1

输入

4

输出

3

规律

前三个数为0 1 1

第四个数等于第一个数+2倍第二个数+第三个数的和,以此类推

代码1

  1. 用数组实现
#include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    int nums[1000] = {0,1,1};
    for(int i = 0;i <= n; ++i){
        nums[i+3] = nums[i] + 2 * nums[i+1] + nums[i+2];
    }
    cout << nums[n-1];
    return 0;
}

代码2

  1. 用vector实现
#include <bits/stdc++.h>

using namespace std;

int main(){
    int n;
    cin >> n;
    vector<int> nums = {0,1,1};
    for(int i = 0;i <= n; ++i){
        nums[i+3] = nums[i] + 2 * nums[i+1] + nums[i+2];
    }
    cout << nums[n-1];
    return 0;
}

代码3

  1. 用递归实现
#include <bits/stdc++.h>

using namespace std;

int solve(int num){
    if(num == 1) return 0;
    if(num == 2 || num == 3) return 1;
    return solve(num-3) + 2 * solve(num-2) + solve(num-1);
}

int main(){
    int n;
    cin >> n;
    cout << solve(n);
    return 0;
}