快手2019秋招--魔法深渊

分析:递归或者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;
} 

 

举一反三:

1、兔子繁殖问题

13世纪意大利数学家斐波那契在他的《算盘书》中提出这样一个问题:有人想知道一年内一对兔子可繁殖成多少对,便筑了一道围墙把一对兔子关在里面。已知一对兔子每一个月可以生一对小兔子,而一对兔子出生后.第三个月开始生小兔子假如一年内没有发生死亡,则一对兔子一年内能繁殖成多少对?

标准的斐波那契数列又称兔子数列

分析:这就是斐波那契数列的由来,本节的跳台阶问题便是此问题的变形,只是换了种表述形式。

2、换硬币问题。

想兑换100元钱,有1,2,5,10四种钱,问总共有多少兑换方法。

const int N = 100;
int dimes[] = { 1, 2, 5, 10 };
int arr[N + 1] ;
memset(arr,0,sizeof(arr));
arr[0]=1;
for (int i = 0; i < sizeof(dimes) / sizeof(int); ++i)
{
    for (int j = dimes[i]; j <= N; ++j)
    {
        arr[j] += arr[j - dimes[i]];
    }
}

 

posted @ 2019-08-20 12:28  浅滩浅  阅读(245)  评论(0编辑  收藏  举报