3n+1数链问题

本文探讨了递归算法在解决特定数学问题时的应用,并通过动态规划的方法进行优化,以减少重复计算,提高效率。文章提供了两个不同实现方式的代码示例:一个使用递归加缓存的方法,另一个则是简单的暴力求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用时间换空间,然而需要的空间太大,卡在第6个样例,我觉得应该可以压缩的。

#include <stdio.h>
#include <string.h>

int const maxn = 7000000;  //不知道上限在哪里 
int g_a[maxn];
int g_i,g_j;
int g_ans=0;

int dfs(int i) {
    if (g_a[i]!=-1) return g_a[i];
    int & tmp = g_a[i];
    if(i==1) {
        tmp=1;
        return tmp;
    }
    if(i%2==0) {
        tmp = dfs(i/2)+1;
        return tmp;
    }
    if (i%2==1) {
        tmp = dfs(i*3+1)+1;
        return tmp;
    }

}



int main() {
    scanf("%d%d",&g_i,&g_j);
    memset(g_a,-1,sizeof(g_a));
    for(int i=g_i;i<=g_j;i++) {
        int k = dfs(i);
        if(k>g_ans) g_ans = k;
    }
    printf("%d\n",g_ans);
}

朴素的暴力求解:

#include<stdio.h>
int length( int n );

int main()
{
    int i, j;
    int k;
    int max = 0;

    scanf("%d %d", &i, &j );

    for ( k = i; k <= j; k++ )
    {
        if ( length(k) >= max )
        {
            max = length(k);    /* 更新最大值 */
        }
    }

    printf( "%d\n", max );

    return 0;
} 

int length( int n )
{
    int length = 1;

    while ( n != 1 )
    {
        if ( n % 2 == 1 )
        {
            n = n * 3 + 1;
        }
        else
        {
            n /= 2;
        }

        length++; 
    }

    return length;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值