cogs87 乘积最大

cogs87 乘积最大


原题链接


题解

竟然不用高精。。。
f[i][j]表示前i位数j个乘号的最大数f[i][j]=max{f[i-l][j-1]*num[i-l+1][i]}
num[a][b]表示字符串a..b位的数


Code

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define Fname "cjzd"
using namespace std;
#define rep(a,b,c) for(rg int a=b;a<=c;a++)
#define drep(a,b,c) for(rg int a=b;a>=c;a--)
#define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
#define il inline
#define rg register
#define vd void
typedef long long ll;
il int gi(){
    rg int x=0;rg char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
char str[42];
ll num[42][42];
ll f[42][42];
il vd print(ll n){
    if(n/10)print(n/10);
    putchar(n%10+'0');
}
int main(){
    freopen(Fname".in","r",stdin);
    freopen(Fname".out","w",stdout);
    int n=gi(),k=gi();
    scanf("%s",str+1);
    rep(i,1,n)rep(j,i,n)num[i][j]=num[i][j-1]*10+str[j]-'0';
    rep(i,1,n)f[i][0]=num[1][i];
    rep(i,1,n)rep(j,1,k)rep(l,1,i-1)f[i][j]=max(f[i][j],f[i-l][j-1]*num[i-l+1][i]);
    if(f[n][k])print(f[n][k]);
    else puts("0");
    return 0;
}

PS.洛谷竟然因为一个讨论贴更新数据。。。这是人性的扭曲还是道德的沦丧
原文地址:https://www.cnblogs.com/xzz_233/p/7496656.html