利用加法器的思想去理解高精度加和高精度乘
#include<bits/stdc++.h>
#define int long long
#define x first
#define y second
#define de(x) cout<<#x<<" = "<<x<<" "
#define deg(x) cout<<#x<<" = "<<x<<endl
using namespace std;
const int N=70,M=35;
typedef pair<int,int> PII;
int a[N];
int f[N][N][M];
int tp[M];
void add(int a[],int b[])
{
static int c[M];
int t=0;
for(int i=0;i<M;i++)
{
c[i]=t+a[i]+b[i];
t=c[i]/10;
c[i]%=10;
}
memcpy(a,c,sizeof c);
}
void mul(int a[],int b)
{
static int c[M];
int t=0;
for(int i=0;i<M;i++)
{
c[i]=t+a[i]*b;
t=c[i]/10;
c[i]%=10;
}
memcpy(a,c,sizeof c);
}
int cmp(int a[],int b[])
{
for(int i=M-1;i>=0;i--)
{
if(a[i]>b[i])return 1;
else if(a[i]<b[i])return -1;
}
return 0;
}
void print(int a[])
{
int k=M-1;
while(!a[k])k--;
for(int i=k;i>=0;i--)cout<<a[i];
cout<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int len=3;len<=n;len++)
for(int l=1;l+len-1<=n;l++)
{
int r=l+len-1;
f[l][r][M-1]=1;
for(int k=l+1;k<r;k++)
{
memset(tp,0,sizeof tp);
tp[0]=a[l];
mul(tp,a[k]);
mul(tp,a[r]);
add(tp,f[l][k]);
add(tp,f[k][r]);
if(cmp(tp,f[l][r])<0)memcpy(f[l][r],tp,sizeof tp);
}
}
print(f[1][n]);
return 0;
}