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; }
请各位大佬斧正(反正我不认识斧正是什么意思)