C++从入门到入土-递推

1.数字三角形


#include<iostream>
#include<cstdio>
using namespace std;
int  main()
{
    int n;
    int s[101][101] = { 0 };
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            cin >> s[i][j];
        }
    }

    int max[101][101] = { 0 };
    for (int i = 1; i <= n; i++)
    {
        //初始化,最下面一层的max数组就是三角形最下面一层的值
        max[n][i] = s[n][i];
    }
    for (int i = n - 1; i >= 1; i--)
    {
		//从倒数第二层向上计算
        for (int j = 1; j <= i; j++)
        {
			//计算第 i 层的每一个点的 max[][]
            int one = max[i + 1][j];	//要么向下一层上和它最近的左边走
            int two = max[i + 1][j + 1];//要么向下一层上和它最近的右边走
            if (one > two)
            {
                max[i][j] = s[i][j] + one;
            }
            else
            {
                max[i][j] = s[i][j] + two;
            }
        }
    }
    cout << max[1][1];
	return 0;

2.骨牌


#include <iostream>  
#include<cstdio>
using namespace std;  
int main()  
{  
	freopen("domino.in","r",stdin);
	freopen("domino.out","w",stdout);
    int i,n;  
    cin>>n;  
    int a[4],t;  
    a[1]=1;a[2]=2;a[3]=4;  
    if(n<=3) cout<<a[n]<<endl;  
    else  
    {  
        for(i=4;i<=n;i++)  
        {  
            t=a[1];  
            a[1]=a[2];  
            a[2]=a[3];  
            a[3]=a[1]+a[2]+t;  
        }  
        cout<<a[3]<<endl;  
    } 
    fclose(stdin);
    fclose(stdout);
	return 0; 
}  

3.走楼梯


代码:

#include<cstdio>
#include<cstring>
int n,flag=1; 
int a[5010],b[5010],c[5010];

void Fibonacci()
{
    a[1]=1,b[1]=2;//初始化
    for(int i=3;i<=n;i++)//从第3个循环
    {
        for(int j=1;j<=flag;j++)c[j]=a[j]+b[j];//相加
        for(int j=1;j<=flag;j++)//进位
        {
            if(c[j]>9)//大于9才进
            {
                c[j+1]+=c[j]/10;
                c[j]%=10;
                if(j+1>flag)ns++;
            }
        }
        for(int j=1;j<=ns;j++)a[j]=b[j];
        for(int j=1;j<=ns;j++)b[j]=c[j];
        //交换
    }
}
int main()
{
	freopen("stair.in","r",stdin);
	freopen("stair.out","w",stdout);
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    //清 0
    scanf("%d",&n);//输入
    if(n<3)
    {
        printf("%d",n);
        return 0;
    }
    Fibonacci();
    for(int i=ns;i>0;i--)printf("%d",b[i]);
    //逆序输出
    fclose(stdin);
    fclose(stdout);
    return 0;
}

4.兔子繁殖


//F(N) = F(N-1) + F(N-2) ;
#include <iostream>
using namespace std;
int rab[22][81];
int main() 
{
	freopen("rabbit.in","r",stdin);
	freopen("rabbit.out","w",stdout);
	int m=1, d, i, j, count;
	cin>>d ;
	if(m || d)
	{
		memset(rab,0,sizeof(rab));
		rab[0][0] = 1;
		for(j = 1; j <= d; j++)
		{
			rab[m + 1][j] = rab[m + 1][j - 1] + rab[m][j - 1];
			rab[0][j] += rab[m + 1][j];
			for(i = m; i > 0; i--)
			{
			rab[i][j] = rab[i - 1][j - 1];
			}
		}
		for(i = 0, count = 0; i <= m; i++)
		count += rab[i][d];
		cout<<count<<endl;
	}
	fclose(stdin);
	fclose(stdout);
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/qq_41993986/article/details/80029350