zoukankan      html  css  js  c++  java
  • noip提高组2000 乘积最大

    原题链接:

    要写高精才能过的luogu:https://www.luogu.org/problem/show?pid=1018

    用long long就能水过的codevs:http://codevs.cn/problem/1017/

    首先先来说DP部分,因为k<=6,因此可以枚举断点位置。

    sum[i][j]表示原数的第i位到第j位构成的数字,f[i][l]表示前i个数字划分l次时的最大值。

    设当前划分l段,j为断点位置,对于确定的i与j,断点到i的值只能为sum[j+1][i],断点之前划分的段数也是确定的,为l-1,断点之前划分l-1段能得到的最大值也是在之前已经计算出来的,所以将其相乘,检查能否更新f[i][l]即可。

    高精方面,几乎是与“矩阵取数游戏”(“矩阵取数游戏”的博客链接:http://www.cnblogs.com/zeroform/p/7697803.html)一样,采用结构体存储数的每一位与数的位数,不过由于需要计算任意两位置之间的数字,压位不是很方便,所以并没有压位(但是在luogu上0ms跑过无压力)。

    #include<cstdio>
    #include<cstring>
    struct num
    {
        int c[205],w;
    }a;
    num f[55][55],sum[55][55];
    char s[55];
    int k;
    void print(num x)
    {
        for(int i=x.w;i>0;i--) printf("%d",x.c[i]);
    }
    num getmax(num x,num y)
    {
        if(x.w>y.w) return x;
        if(x.w<y.w) return y;
        for(int i=x.w;i>0;i--)
        {
            if(x.c[i]>y.c[i]) return x;
            if(y.c[i]>x.c[i]) return y;
        }
        return x;
    }
    num mul(num x,num y)
    {
        num t;
        t.w=1;
        memset(t.c,0,sizeof(t.c));
        for(int i=1;i<=x.w;i++)
        {
            for(int j=1;j<=y.w;j++) t.c[i+j-1]+=x.c[i]*y.c[j];
        }
        for(int i=1;i<=x.w+y.w+2;i++)
        {
            if(t.c[i]>0) t.w=i;
            if(t.c[i]>9)
            {
                t.c[i+1]+=t.c[i]/10;
                t.c[i]%=10;
            }
        }
        return t;
    }
    int main()
    {
        scanf("%d %d",&a.w,&k);
        scanf("%s",s);
        for(int i=1;i<=a.w;i++) a.c[a.w+1-i]=s[i-1]-'0';
        for(int i=1;i<=a.w;i++)
        {
            for(int j=i;j<=a.w;j++)
            {
                sum[i][j].w=j-i+1;
                int len=0;
                for(int l=j;l>=i;l--) sum[i][j].c[++len]=s[l-1]-'0';
            }
        }
        for(int i=1;i<=a.w;i++) f[i][0]=sum[1][i];
        for(int l=1;l<=k;l++)
        {
            for(int i=l;i<=a.w;i++)
            {
                for(int j=l;j<i;j++) f[i][l]=getmax(f[i][l],mul(f[j][l-1],sum[j+1][i]));
            }
        }
        print(f[a.w][k]);
        return 0;
    }
  • 相关阅读:
    4、配置解决中文乱码的过滤器
    3、请求参数绑定
    2、SpringMVC常用注解
    SpringMVC快速搭建
    深拷贝与浅拷贝笔记
    SpringBoot入门(三)——SpringData JPA
    SpringBoot入门(二)——Web
    SpringBoot入门(一)——HelloWorld、配置、日志
    Java SSM(十八)——Mybatis查缺补漏
    Java SSM(十七)——SpringMVC查缺补漏
  • 原文地址:https://www.cnblogs.com/zeroform/p/7735115.html
Copyright © 2011-2022 走看看