虎牙C++笔试分享

编程三道题
分享下第三题的水dp写法
求0-n之间二进制内没有连续三个1的数的个数
#include <iostream>
using namespace std;
int v[100];
int dp[100][3];
int dfs(int len,int flag,bool limit){
    if (flag == 3) return 0;
    if (len == 0) return 1;
    if (!limit&&dp[len][flag] != -1) return dp[len][flag];
    int maxx = limit ? v[len] : 1;
    int cnt = 0;
    for (int i = 0; i <= maxx; i++){
        if (i == 0){
            cnt += dfs(len-1,0,limit&&i == v[len]);
        }
        else{
            cnt += dfs(len-1, flag+1 , limit&&i == v[len]);
        }
    }
    return limit ? cnt : dp[len][flag] = cnt;
}
int solve(long long x){
    memset(v, 0, sizeof(v));
    int k = 0;
    while (x){
        v[++k] = x % 2;
        x >>=1;
    }
    return dfs(k, 0, true);
}
int main(){
    memset(dp, -1, sizeof(dp));
    long long a;
    cin >> a;
    cout<<solve(a)<<endl;
    return 0;
}

#虎牙直播##笔试题目##题解#
全部评论
没人暖贴的嘛  桑心   回复0 | 赞 1 | 浏览302
点赞 回复
分享
发布于 2018-09-14 21:18
虎牙大佬
点赞 回复
分享
发布于 2018-11-01 16:31
百信银行
校招火热招聘中
官网直投
学***佬,请问还有什么题吗,方便透露一下,练练手,感谢~ #include <iostream> using namespace std; int main() {     int n;     cin>>n;     int num = 0;     for(int i = 0;i <= n;i++)     {         for(int j = i;j > 0;j>>=1)         {             int temp1 = j & 1;             j>>=1;             cout<<j<<":"<<temp1<<endl;             int temp2 = j & 1;             j>>=1;             cout<<j<<":"<<temp2<<endl;             int temp3 = j & 1;             cout<<j<<":"<<temp3<<endl;             if(temp1 == 1 && temp2 == 1 && temp3 == 1)             {                 num++;             }         }     }     cout<<num;     return 0; }
点赞 回复
分享
发布于 2019-04-22 09:32

相关推荐

点赞 12 评论
分享
牛客网
牛客企业服务