zoukankan      html  css  js  c++  java
  • Luogu-P1018 乘积最大

     

    题目

    题目链接

     

    测试得分:  60

    主要算法 :  动态规划,高精动规,区间动规

     

    题干:

        区间动规板子

    应试策略:

      将所有的字符转化为数字形式存储在a[i][j]中,a[i][j]表示的是从i到j的数字形式,f[i][j]表达的是在前j个数中,划分为i+1部分的乘积,先将f[0][i]初始状态划分a[1][i]

      先枚举划分的部分,再进行判断区间的末端,进而再确定划分的位置,进行状态方程转移f[i][j]=max(f[i][j],f[i-1][l]*a[l+1][j]);

      

       代码

    #include<stdio.h>
    #include<stdlib.h>
    #include<iostream>
    #define LL long long 
    #define FORa(i,s,e) for(int i=s;i<=e;i++)
    #define FORs(i,s,e) for(int i=s;i>=e;i--)
    #define gc pa==pb&&(pb=(pa=buf)+fread(buf,1,100000,stdin),pa==pb)?EOF:*pa++
    #define File(name) freopen(name".in","r",stdin);freopen(name".out","w",stdout);
    
    using namespace std;
    static char buf[100000],*pa=buf,*pb=buf;
    inline int read();
    
    const int K=6,N=40;
    string s;
    LL k,n,f[K+1][N+1],a[N+1][N+1];//a[i][j]将i-j字符转换为数字形式,f[i][j]代表在前j个数中划分i+1部分的最大乘积 
    int main()
    {
        scanf("%d%d",&n,&k);
        cin>>s;
        FORa(i,1,n) FORa(j,i,n) a[i][j]=a[i][j-1]*10+s[j-1]-'0';//处理成数字形式 
        FORa(i,1,n) f[0][i]=a[1][i];
        FORa(i,1,k)
            FORa(j,1,n)
                FORa(l,i-1,j-1)//注意最小值为k-1,而不是i,自己思考一下为什么这样 
                    f[i][j]=max(f[i][j],f[i-1][l]*a[l+1][j]);
        printf("%lld",f[k][n]);
        return 0;
    }
    inline int read()
    {
        register int x(0);register int f(1);register c(gc);
        while(c<'0'||c>'9') f=c=='-'?-1:1,c=gc;
        while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=gc;
        return  x*f;
    }

    总结:

      注意边界,判断数据的大小(此处需打高精)

  • 相关阅读:
    什么是em?
    数据结构与算法:快速排序
    flex中flexshrink的理解
    前端的padding是参照父元素的宽度还是高度?
    子元素的border不能通过百分比设置的
    数据库去重的简易方法
    windows2003 iis6.0站点打不开,找不到服务器或 DNS 错误。
    常用WebServices返回数据的4种方法比较
    手机身份证IP地址开放接口(很实用哦)
    从创业失败中学到的七条教训
  • 原文地址:https://www.cnblogs.com/SeanOcean/p/11209943.html
Copyright © 2011-2022 走看看