首页 > 其他 > 详细

快手2019秋招--魔法深渊

时间:2019-08-20 12:44:45      阅读:161      评论:0      收藏:0      [点我收藏+]

技术分享图片

技术分享图片

分析:递归或者dp,爬楼梯很老的一道题目

当前台阶方法数 = 所有一次可到达当前台阶方法数的和

最初的题目是只能上1、2、3个台阶所以dp[i]+=dp[i-1]+dp[i-2]+dp[i-3];

这个是1,2,4,8,16,32,就是2^n方,也就是只要t=i-2^n>=0,dp[i]+=dp[i-t]

dp的ac代码如下:

#include <bits/stdc++.h>
using namespace std;

const int maxn=1000+5;
int dp[maxn]; 
int main()
{
	int N,n;
	cin>>n;
	while(n--){
	cin>>N;
	memset(dp,0,sizeof(dp));
	dp[0]=dp[1]=1;
	dp[2]=2;
	dp[3]=3;
	for(int i=4;i<=N;i++){
	for(int j=0;j<i;j++){
	int tmp=i-pow(2,j);
	if(tmp>=0){
	dp[i]+=dp[tmp];
	dp[i]=dp[i]%1000000003;	
	}	

	else break;	
	}	
	}
	cout<<dp[N]<<endl;
	}
    return 0;
}

 用递归只能过50%的数据

#include <bits/stdc++.h>
using namespace std;

int solution(int N){
int s=0; 
if(N==1||N==0) return 1;
if(N==2) return 2;
if(N==3) return 3; 
for(int i=0;pow(2,i)<=N;i++){
s+=solution(N-pow(2,i));	
}
	return s;
} 
int main()
{
	int N,n;
	cin>>n;
	while(n--){
	cin>>N;
	cout<<solution(N)<<endl;
	}
    return 0;
}

  

 

快手2019秋招--魔法深渊

原文:https://www.cnblogs.com/cstdio1/p/11382192.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!