问题标题: 酷町堂:4366 搬砖(rock)

0
0
已解决
陈曦
陈曦
资深天翼
资深天翼

看了我同学的贴后,我按着他的思路写了一遍。然后,我也被卡住了:

#include<iostream>
#include<cstdio>
using namespace std;
long long n,a[5]={0,1,2,3};
long long f(long long t,long long n){
    long long ans=0;
    if(n==0 || n==1 ) return 1;
    for(long long i=1;i<=3 && a[i]<=n;i++){
        ans=ans+f(i,n-a[i]);
    }
    return ans;
}
int main(){
    cin>>n;
    cout<<f(1,n);
    return 0;
}

 


0
已采纳
陈梓恒
陈梓恒
初级守护
初级守护

我做出来了,这是我区赛做过的,只是一个斐波那契数列,只不过递归的时前一项前二项和前三项的和

0
张新杨
张新杨
高级守护
高级守护

在函数中加记忆化搜索:a[45][45]

如果是n==a[n][t]且a[n][t]!=-1,直接return a[n][t],可以少一些循环次数,就不会超时

ps:a[n][t]初值为-1

0
陈梓恒
陈梓恒
初级守护
初级守护

三个砖有四种搬法:111 12 21 3

在递归里也要写出n==2和n==3的if和return要不然只会for循环

我递归是这样写的

long long n,a[5]={0,1,2,4};
long long f(long long t,long long n){
    long long ans=0;
    if(n==0||n==1)return 1;
    if(n==2)return 2;
    if(n==3)return 4;
    for(long long i=1;i<=3 && a[i]<=n;i++)
        ans+=f(i,n-a[i]);
    return ans;
}

不知道对不对

我要回答