zoukankan      html  css  js  c++  java
  • 低位值

    链接: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):
    输入n,求f(l, r)的最大值。

    输入描述:

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

    输出描述:

    一行一个整数表示答案。

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

    先另n = 1-10
    找到l = 1;
    直接找出递归的关系式了,从顶到底的递归。
    otherwise 的条件是r是2的幂次的时候。。
    #include<bits/stdc++.h>
    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 = "<<col << ' '<< max;
            cout << endl;
    
        }
        system("pause");
    }*/
    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");
    }

    参考:

  • 相关阅读:
    fastjson报错 java.lang.StackOverflowError
    关于mybatis使用foreach插入速度较慢的问题
    selectKey返回查询的LAST_INSERT_ID的总是1
    使用java制作https证书
    cf 809
    多校 2009 3
    多校 2009 2
    多校 2009 1
    codeforces 808
    hdu 4734 数位DP
  • 原文地址:https://www.cnblogs.com/Aliencxl/p/11946504.html
Copyright © 2011-2022 走看看