递归公式:f ( i , j ) = f ( i-1 , j ) + f ( i-1, j-1 )
#include <iostream>
#include <cstdio>
using namespace std;
inline int yang (int i,int j)
{
if (j==1||i==j) return 1; //两边和顶角都是1
else return yang(i-1,j)+yang(i-1,j-1);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for (int i=1;i<=n;i++)
for (int j=1;j<=i;j++)
if (j==i) cout<<yang(i,j)<<endl;
else cout<<yang(i,j)<<" ";
}
return 0;
}
现在贴一串运用数组记忆化剪枝的代码,这串代码是不会超时,可以A的
#include <iostream>
#include <cstdio>
#define MAX 35
using namespace std;
int fun[MAX][MAX];
int yang (int i,int j)
{
if (j==1||i==j) return 1;
if (fun[i][j]) return fun[i][j];
else return fun[i][j]=yang(i-1,j)+yang(i-1,j-1);
}
int main()
{
int n;
fun[0][0]=fun[1][0]=fun[1][1]=1;
while(scanf("%d",&n)!=EOF)
{
for (int i=1; i<=n; i++)
for (int j=1; j<=i; j++)
if (j==i) cout<<yang(i,j)<<endl;
else cout<<yang(i,j)<<' ';
cout<<endl;
}
return 0;
}