链接: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"); }
参考: