LovelyPanda

题目描述

给出n(n20)n(n≤20),输出杨辉三角的前 nn 行。
如果你不知道什么是杨辉三角,可以观察样例找找规律。

输入输出样例

输入样例:

6

输出样例:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

题解

来一发递推题解,直接DP。

1定义状态f[i][j]f[i][j] 为第 ii 行第 jj 列的杨辉三角的数。
2状态转移
(1)列出杨辉三角的二维数组形式,以 n=5n=5 为例:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

(2)由图可见,状态转移方程为: f[i][j]=f[i1][j1]+f[i1][j]f[i][j]=f[i−1][j−1]+f[i−1][j]
(3)边界条件很显然是:当 j=0j=0 时, f[i][j]=1f[i][j]=1
3.分析时空复杂度:
时间复杂度:O(n2)O(n^2)
空间复杂度:O(n2)O(n^2)
4.上代码

#include <iostream>
using namespace std;
typedef long long ll;
const int N = 55;    //个人习惯
ll f[N][N];
void init() {
    for(int i = 1;i < N; i++) {
        for(int j = 1;j <= i; ++j) {
            if(j == 1) {
                f[i][j] = 1;
            }    //边界条件
            else {
                f[i][j] = f[i - 1][j - 1] + f[i - 1][j];      //状态转移方程
            }
        }
    }
}
int main () {
    init();
    int n;
    cin >> n;
    for(int i = 1;i <= n; i++) {
        for(int j = 1; j <= i; j++) {
            cout << f[i][j] << \' \';
        }
        cout << \'\n\';
    }    //输出
    return 0;
}

顺便附个dfs代码:(不是同一题!!!):

#include <bits/stdc++.h>
using namespace std;
int tri(int n,int m){
    if(m==1||n==m) return 1;
        else return tri(n-1,m)+tri(n-1,m-1);
} 
int main ()
{    
    //freopen("tri.in","r",stdin);
    //freopen("tri.out","w",stdout);    
    int n, m;    
    while (cin>>n>>m)    {
            cout<<tri(n,m)<<endl;    
    }    
    return 0;
}

分类:

技术点:

相关文章: