题目描述
给出,输出杨辉三角的前 行。
如果你不知道什么是杨辉三角,可以观察样例找找规律。
输入输出样例
输入样例:
6
输出样例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
题解
来一发递推题解,直接DP。
1定义状态: 为第 行第 列的杨辉三角的数。
2状态转移:
(1)列出杨辉三角的二维数组形式,以 为例:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
(2)由图可见,状态转移方程为: 。
(3)边界条件很显然是:当 时, 。
3.分析时空复杂度:
时间复杂度:
空间复杂度:
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;
}