把目前所有的题解全交了一遍,没有一篇能AC~QWQ。以下是自己写的AC代码,可供参考:
#include<bits/stdc++.h>
using namespace std;
int n, K;
struct highacc{
const int N=150;
short v[150];
highacc() {
memset (v, 0, sizeof (v));
}
inline void operator = (int b) {
for (int i=1; i<N; ++i)
v[i]=b-b/10*10, b/=10;
}
inline void operator = (highacc b) {
for (int i=1; i<N; ++i)
v[i]=b.v[i];
}
inline highacc operator + (int b) {
highacc ans;
for (int i=1; i<N; ++i)
ans.v[i]=v[i];
ans.v[1]+=b;
for (int i=1; i<N-1; ++i)
ans.v[i+1]+=ans.v[i]/10,
ans.v[i]-=ans.v[i]/10*10;
return ans;
}
inline highacc operator + (highacc b) {
highacc ans;
for (int i=1; i<N; ++i)
ans.v[i]=v[i]+b.v[i];
for (int i=1; i<N-1; ++i)
ans.v[i+1]+=ans.v[i]/10,
ans.v[i]-=ans.v[i]/10*10;
return ans;
}
inline highacc operator - (highacc b) {
highacc ans;
for (int i=1; i<N; ++i) {
ans.v[i]=v[i]-b.v[i];
if (ans.v[i]<0)
ans.v[i]+=10,
--ans.v[i+1];
}
return ans;
}
inline highacc operator * (highacc b) {
highacc ans;
for (int i=1; i<=N/2; ++i)
for (int j=1; j<=N/2; ++j)
ans.v[i+j-1]+=v[i]*b.v[j];
for (int i=1; i<N-1; ++i)
ans.v[i+1]+=ans.v[i]/10,
ans.v[i]-=ans.v[i]/10*10;
return ans;
}
inline highacc operator * (int b) {
highacc ans;
for (int i=1; i<N; ++i)
ans.v[i]=v[i]*b;
for (int i=1; i<N-1; ++i)
ans.v[i+1]+=ans.v[i]/10,
ans.v[i]-=ans.v[i]/10*10;
return ans;
}
inline bool operator < (highacc b) const {
for (int i=N-1; i>=1; --i)
if (v[i]<b.v[i]) return 1;
else if (v[i]>b.v[i]) return 0;
return 0;
}
inline void output() {
int i=N-1;
while (i && !v[i]) --i;
if (!i) cout << 0;
while (i) putchar(v[i--]+'0');
}
};
highacc f[42][42][7];
string s;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> K >> s; s=' '+s;
for (int i=1; i<=n; ++i) f[i][i][0]=int(s[i])-'0';
for (int len=2; len<=n; ++len)
for (int l=1; l+len-1<=n; ++l) {
int r=l+len-1;
f[l][r][0]=f[l][r-1][0]*10+f[r][r][0];
for (int c=1; c<=K; ++c)
for (int k=l; k<r; ++k)
f[l][r][c]=max(f[l][r][c], f[l][k][0]*f[k+1][r][c-1]);
}
f[1][n][K].output();
return 0;
}