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;
}

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

猜你喜欢

转载自www.cnblogs.com/handsome-zyc/p/11309238.html
今日推荐