[hihocoder1527]快速乘法

来源:互联网 发布:淘宝店铺开店教程 编辑:程序博客网 时间:2024/05/16 02:54

题目描述

在写代码时,我们经常要用到类似 x × a 这样的语句( a 是常数)。众所周知,计算机进行乘法运算是非常慢的,所以我们需要用一些加法、减法和左移的组合来实现乘一个常数这个操作。具体来讲, 我们要把 x × a 替换成:(x<<a0)op1(x<<a1)op2(x<<a2)...opn(x<<an),然后减去一个2j,这样[j,i]全部都是1,多出来的部分减掉。
f[i]=min(f[j-1]+2+sum[i]-sum[j-1])
枚举j则复杂度是平方。
注意不同的两个决策j和k,在i移一单位时,变化量一样,因此最优决策很容易维护。

#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=1000000+10;char s[maxn];int sum[maxn],f[maxn];int i,j,k,l,t,n,m,ans,mx;int main(){    scanf("%s",s+1);    n=strlen(s+1);    reverse(s+1,s+n+1);    fo(i,1,n) sum[i]=sum[i-1]+(s[i]=='0');    mx=-1;    fo(i,1,n){        if (s[i]=='0') f[i]=f[i-1];        else{            f[i]=f[i-1]+1;            if (mx) f[i]=min(f[i],f[mx-1]+2+sum[i]-sum[mx-1]);        }        if (mx==-1||f[mx-1]+2+sum[i+1]-sum[mx-1]>=f[i-1]+2+sum[i+1]-sum[i-1]) mx=i;    }    ans=f[n];    printf("%d\n",ans*2-1);}
原创粉丝点击