• LOJ P10149 凸多边形的划分 题解


    Analysis

    区间dp+压位高精

    dp五分钟,高精两小时

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 110
    #define INF 2147483647
    using namespace std;
    typedef long long ll;
    ll dp[maxn][maxn][maxn],a[maxn];
    ll s1[maxn],s2[maxn],s3[maxn];
    int n;
    inline void mark(ll c[])
    {
        for(int i=1;i<=c[0];i++)
        {
            c[i+1]+=c[i]/10000;
            c[i]%=10000;
        }
        while(c[c[0]+1])
        {
            c[0]++;
            c[c[0]+1]+=c[c[0]]/10000;
            c[c[0]]%=10000;
        }
    }
    inline void mul(ll a1,ll a2,ll a3,ll c[])
    {
        c[0]=1;
        c[1]=1;
        for(int i=1;i<=c[0];i++) c[i]*=a1;
        mark(c);
        for(int i=1;i<=c[0];i++) c[i]*=a2;
        mark(c);
        for(int i=1;i<=c[0];i++) c[i]*=a3;
        mark(c);
    }
    inline void add(ll a[],ll b[],ll c[])
    {
        c[0]=max(a[0],b[0]);
        for(int i=1;i<=c[0];i++) c[i]=a[i]+b[i];
        mark(c);
    }
    inline bool compare(ll a[],ll b[])
    {
        if(a[0]>b[0]) return 1;
        else if(a[0]<b[0]) return 0;
        for(int i=a[0];i>=1;i--)
        {
            if(a[i]>b[i]) return 1;
            else if(a[i]<b[i]) return 0;
        }
        return 0;
    }
    inline void print()
    {
        printf("%lld",dp[1][n][dp[1][n][0]]);
        for(int i=dp[1][n][0]-1;i>0;i--)
        {
            printf("%lld",dp[1][n][i]/1000);
            printf("%lld",dp[1][n][i]/100%10);
            printf("%lld",dp[1][n][i]/10%10);
            printf("%lld",dp[1][n][i]%10);
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                dp[i][j][0]=0;
        for(int l=2;l<=n-1;l++)
            for(int i=1;i<=n;i++)
            {
                int j=i+l;
                if(j>n) break;
                dp[i][j][0]=INF;
                for(int k=i+1;k<j;k++)
                {
                    memset(s1,0,sizeof(s1));
                    memset(s2,0,sizeof(s2));
                    memset(s3,0,sizeof(s3));
                    mul(a[i],a[j],a[k],s1);
                    add(dp[i][k],dp[k][j],s2);
                    add(s1,s2,s3);
                    if(compare(dp[i][j],s3))
                        memcpy(dp[i][j],s3,sizeof(s3));
                }
            }
        print();
        return 0;
    }

    请各位大佬斧正(反正我不认识斧正是什么意思)

  • 相关阅读:
    简单poi创建execl
    Orcale 存储过程实践总结
    PLSQL 创建自定义函数注意事项
    字符串算法模板整理
    多项式FFT/NTT模板(含乘法/逆元/log/exp/求导/积分/快速幂)
    UVALive
    Gym
    Gym
    Kattis
    Kattis
  • 原文地址:https://www.cnblogs.com/handsome-zyc/p/11309238.html
Copyright © 2020-2023  润新知