P1018 乘积最大

来源:互联网 发布:二手书交易网站 知乎 编辑:程序博客网 时间:2024/05/29 19:32

https://www.luogu.org/problem/show?pid=1018#sub
这里写图片描述
这里写图片描述

其实这个数据范围貌似搜索是过不了的,但是在lg上过了
这里搜索的方法是,dfs(int x,LL ans,int bef),x表示已经用了几个乘号,ans表示前面放完乘号得到的乘积,bef表示上一个乘号放的位置(后面);
那么,如果x< k,把bef和当前要放的位置之间的数乘进ans;
放完最后一个,要把后面剩下的数乘进ans;
而且,放第x个乘号时,位置不能大于n-k+x,因为要给后面的乘号留下足够的位置。

#include<iostream>#include<cstdio>#define LL long longusing namespace std;int n,k,a[50];LL maxn;void dfs(int x,LL ans,int bef){    if(x==k)    {        LL num=0;        for(int i=bef+1;i<=n;i++)        {            num=num*10+a[i];        }        maxn=max(maxn,ans*num);        return;    }    for(int i=bef+1;i<=n-k+x;i++)    {        LL num=0;        for(int p=bef+1;p<=i;p++)            num=num*10+a[p];        dfs(x+1,ans*num,i);    }    return;}int main(){    scanf("%d%d\n",&n,&k);    for(int i=1;i<=n;i++)    {        char o;        cin>>o;        a[i]=o-'0';    }    dfs(0,1,0);    printf("%lld",maxn);    return 0;}