关爱后人
查看原帖
关爱后人
1305692
xiangixuan楼主2024/12/28 14:04

把目前所有的题解全交了一遍,没有一篇能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;
}
2024/12/28 14:04
加载中...