低位值

链接:https://ac.nowcoder.com/acm/problem/16745
来源:牛客网

题目描述

定义lowbit(x) =x&(-x),即2^(p-1) (其中p为x的二进制表示中,从右向左数第一个1的位置),例如lowbit(10)=2,lowbit(3)=1。
定义函数f(l, r)为(其中0 <= l, r <= n):
低位值_第1张图片
输入n,求f(l, r)的最大值。

输入描述:

n以二进制形式给出,一行一个二进制01串n,表示l,r的上界。
1 <= 字符串n的长度 <= 20,000
数据保证没有前缀0。

输出描述:

一行一个整数表示答案。

思路:本以为是dp问题,没想到是通过暴力找规律:

先另n = 1-10
低位值_第2张图片

 

 

找到l = 1;
直接找出递归的关系式了,从顶到底的递归。
otherwise 的条件是r是2的幂次的时候。。

 

 

#include
using namespace std;
/*int dp[101][101];
int lowbit(int x){
    return x&(-x);
}
    
int main(){
    int n = 100;
    memset (dp,0,sizeof(dp));
    for(int i = 0; i <= n; i++){
        cout << i << ' ';
        for(int l = 0; l <= i; l++)
            for(int r = 0; r <= i; r++){
                if(l >= r)
                    dp[l][r] = 0;
                else
                if(r - lowbit(r) >= l)
                    dp[l][r] = dp[l][r-lowbit(r)] + 1;
                else 
                    dp[l][r] = dp[l][r-1] + 1;
            }
        int row= 0,col = 0;
        int max = 0;
        for(int l = 0; l <= i; l++)
            for(int r = 0; r <= i; r++){
                if(dp[l][r] >= max){
                    max = dp[l][r];
                    row = l;
                    col = r;
                }
                    
            }
        cout << "l = "<< row << " r = "<*/
int main(){
    string s;
    cin >> s;
    int len = s.length();
    if(len == 1){
        cout << 1 << endl;
        return 0;
    }
    int num1 , num2;
    num1 = num2 = 0;
    for(int i = 1; i < len; i++){
        if(s[i] == '1')
            num1++;
    }
    for(int i = 1; i < len; i++){
        if (s[i] == '1'){
            num2 = len -(i+1); break;
        }
    }
    cout << max(num1,num2) + len*(len-1)/2 << endl;
    system("pause");
}

参考:

http://www.voidcn.com/article/p-ystczoqy-brx.html
https://www.cnblogs.com/weimeiyuer/p/9321566.html

你可能感兴趣的:(低位值)