问题标题: 酷町堂:2752 爬楼梯

0
1
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

小明和同学们顺利闯过了第二关,进入第三关的时候,小明和同学们发现了一个楼梯,可是有些楼梯坏了。智慧之门门主说,只要同学们通过这个楼梯就可以游玩里面的项目,可是同学们必须为我解决一个问题,这个时候大家都迫不及待的让智慧之门门主快点说问题。智慧之门门主指着面前的楼梯说,你可以一步一级,或一步二级,也可以一步三级,但是某些台阶是坏的,即脚不能踩在上面,哪位同学能求出登上最高台阶的总方案数。小明和同学在思考?

输入描述 Input Description

第一行两个整数,第一个数为楼梯总级数n(n<50),第二个数表示有几个坏台阶m
第二行连续m个整数为坏台阶的级数。注意:数据的规模在longint范围内。

输出描述 Output Description

一个整数,表示登上最高台阶的方案数

样例输入 Sample Input

7 2

4 6

样例输出 Sample Output

6

 

样例过了,WA0

#include<bits/stdc++.h>
#include<iostream>
#pragma GCC optimize(3)
using namespace std;
int n,m,a[55],f[55],b[105];
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
    	cin>>a[i];
    	b[a[i]]=1;
	}
	f[1]=1;
	f[2]=2;
	f[3]=4;
	for(int i=4;i<=n;i++){
		if(!b[i]){
			f[i]=f[i-1]+f[i-2]+f[i-3];
		}else{
			f[i]=0;
		}
	}
	cout<<f[n];
    return 0; 
}

 

汪恺恒在2021-02-20 09:20:24追加了内容

高精代码

#include<bits/stdc++.h>
#include<iostream>
#pragma GCC optimize(3)
using namespace std;
long long n,m,s;
string f[105];
int a[10005],b[10005],c[10005];
string Plus(string x,string y){
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	a[0]=x.length(),b[0]=y.length();
	c[0]=max(a[0],b[0]);
	for(int i=1;i<=a[0];i++){
		a[i]=x[a[0]-i]-'0';
	}
	for(int i=1;i<=b[0];i++){
		b[i]=y[b[0]-i]-'0';
	}
	int jw=0;
	for(int i=1;i<=c[0];i++){
		c[i]=a[i]+b[i]+jw;
		jw=c[i]/10;
		c[i]%=10;
	}
	if(jw!=0){
		c[0]++;
		c[c[0]]=jw;
	}
	string ans="";
	for(int i=c[0];i>=1;i--){
		ans+=char(c[i]+'0');
	}
	return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
    	cin>>s;
    	f[s]='0';
	}
	if(f[1]=="") f[1]="1";
	if(f[2]=="") f[2]="2";
	if(f[3]=="") f[3]="4";
	for(int i=4;i<=n;i++){
		if(f[i]==""){
			f[i]=Plus(f[i-1],Plus(f[i-2],f[i-3]));
		}
	}
	cout<<f[n];
    return 0; 
}

 

汪恺恒在2021-02-20 09:23:01追加了内容

发现一个BUG,但还是WA40

#include<bits/stdc++.h>
#include<iostream>
#pragma GCC optimize(3)
using namespace std;
long long n,m,s;
string f[105];
int a[10005],b[10005],c[10005];
string Plus(string x,string y){
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	a[0]=x.length(),b[0]=y.length();
	c[0]=max(a[0],b[0]);
	for(int i=1;i<=a[0];i++){
		a[i]=x[a[0]-i]-'0';
	}
	for(int i=1;i<=b[0];i++){
		b[i]=y[b[0]-i]-'0';
	}
	int jw=0;
	for(int i=1;i<=c[0];i++){
		c[i]=a[i]+b[i]+jw;
		jw=c[i]/10;
		c[i]%=10;
	}
	if(jw!=0){
		c[0]++;
		c[c[0]]=jw;
	}
	string ans="";
	for(int i=c[0];i>=1;i--){
		ans+=char(c[i]+'0');
	}
	return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
    	cin>>s;
    	f[s]="0";
	}
	if(f[1]=="") f[1]="1";
	if(f[2]=="") f[2]="2";
	if(f[3]=="") f[3]="4";
	for(int i=4;i<=n;i++){
		if(f[i]==""){
			f[i]=Plus(f[i-1],Plus(f[i-2],f[i-3]));
		}
	}
	cout<<f[n];
    return 0; 
}

 

汪恺恒在2021-02-20 14:27:04追加了内容

d

汪恺恒在2021-02-20 19:47:05追加了内容

d


0
已采纳
张帆
张帆
中级天翼
中级天翼

你也太随意了吧,不加高精度要爆0的懂吗。

张帆在2021-02-19 15:46:27追加了内容

而且我是这么处理边界的:

   for(int i=1;i<=m;i++){
        int tmp;
        cin>>tmp;
        f[tmp]="0";
    }
    if(f[1]=="") f[1]="1";
    if(f[2]=="") f[2]=add(f[1],"1");
    if(f[3]=="") f[3]=add(add(f[1],f[2]),"1"); 

 

0
张帆
张帆
中级天翼
中级天翼

@汪恺恒 

我知道了,必须要按我这么处理边界才能对,你没有考虑如果1或2等于0,那么按你这么算3就不对了、

 

0
沙宸安
沙宸安
高级启示者
高级启示者

你大意了,这种题是要用递归去做的

0
鹿雨扬
鹿雨扬
资深守护
资深守护

递推式:baif[i]=f[i-1]+f[i-2]+f[i-3](i>=3)

0
张帆
张帆
中级天翼
中级天翼
string add(string s1,string s2){
    int a[100010],b[100010],c[100010];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    a[0]=s1.size();
    b[0]=s2.size();
    for(int i=1;i<=a[0];i++){
        a[i]=s1[a[0]-i]-'0';
    }
    for(int i=1;i<=b[0];i++){
        b[i]=s2[b[0]-i]-'0';
    }
    int l=max(a[0],b[0]);
    for(int i=1;i<=l;i++){
        c[i]=a[i]+b[i]+c[i];
        c[i+1]=c[i]/10;
        c[i]%=10; 
    }
    if(c[l+1]!=0) l++;
    string asd="";
    for(int i=1;i<=l;i++){
        asd+=(char)(c[l-i+1]+48);
    }
    return asd;
}

我的高精代码,你对比一下。

张帆在2021-02-20 09:26:31追加了内容

只有long long 和int 不一样。

张帆在2021-02-20 09:29:31追加了内容

主函数和你一模一样,

要么就是把那个#prama去掉,

以前有位同学加了0分,去掉100分。

0
汪恺恒
汪恺恒
中级启示者
中级启示者

1 3 4三个点WA

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
long long n,m,s;
string f[105];
int a[10005],b[10005],c[10005];
string Plus(string x,string y){
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    a[0]=x.length(),b[0]=y.length();
    c[0]=max(a[0],b[0]);
    for(int i=1;i<=a[0];i++){
        a[i]=x[a[0]-i]-'0';
    }
    for(int i=1;i<=b[0];i++){
        b[i]=y[b[0]-i]-'0';
    }
    int jw=0;
    for(int i=1;i<=c[0];i++){
        c[i]=a[i]+b[i]+jw;
        jw=c[i]/10;
        c[i]%=10;
    }
    if(jw!=0){
        c[0]++;
        c[c[0]]=jw;
    }
    string ans="";
    for(int i=c[0];i>=1;i--){
        ans+=char(c[i]+'0');
    }
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>s;
        f[s]="0";
    }
    if(f[1]=="") f[1]="1";
    if(f[2]=="") f[2]="2";
    if(f[3]=="") f[3]="4";
    for(int i=4;i<=n;i++){
        if(f[i]==""){
            f[i]=Plus(f[i-1],Plus(f[i-2],f[i-3]));
        }
    }
    cout<<f[n];
    return 0; 
}

 

我要回答