60 分紧急求助,给 2 个关注
查看原帖
60 分紧急求助,给 2 个关注
494699
卷王慢即快楼主2023/5/1 20:53

6060 分,不知道咋搞的,帮我搞出来的,悬赏我的和我小号的关注。

#include <bits/stdc++.h>
using namespace std;
struct Bigint {
	int f[107], len;
	Bigint(int x = 0) {
		memset(f, 0, sizeof(f));
		for(len = 1; x; len++)
			f[len] = x % 10, x /= 10;
		len--;
	}
	inline void flatten(int x) {
		len = x;
		for(int i = 1; i <= len; i++) {
			f[i + 1] += f[i] / 10;
			f[i] %= 10;
		}
		while(!f[len]) len--;
	}
	inline void print() {
		for(int i = max(len, 1); i >= 1; i--)
			cout << f[i];
	}
};
inline Bigint operator+(Bigint a, int b) {
	Bigint c = a;
	c.f[1] = c.f[1] + b;
	c.flatten(a.len + 2);
	return c;
}
inline Bigint operator*(Bigint a, Bigint b) {
	Bigint c;
	int mlen = a.len + b.len;
	for(int i = 1; i <= a.len; i++)
		for(int j = 1; j <= b.len; j++)
			c.f[i + j - 1] += a.f[i] * b.f[j];
	c.flatten(mlen + 30);
	return c;
}
inline Bigint work(Bigint a) {
	Bigint ans;
	ans.len = a.len + 1;
	for(int i = 2; i <= ans.len; i++)
		ans.f[i] = a.f[i - 1];
	ans.f[1] = 0;
	return ans;
}
inline Bigint mx(Bigint a, Bigint b) {
	if(a.len > b.len) return a;
	if(a.len < b.len) return b;
	for(int i = a.len; i >= 1; i++) {
		if(a.f[i] > b.f[i]) return a;
		if(a.f[i] < b.f[i]) return b;
	}
	return a;
}
int n, k, la;
char s[47];
Bigint dp[47][10];
Bigint a[47][47];
//dp[i][j] 表示在第 i 位,添加了 j 个乘号的最大乘积 
inline Bigint value(int l, int r) {
	Bigint num(0);
	for(int i = l; i <= r; i++) {
		int tmp = s[i] - '0';
		num = work(num) + tmp;
	}
	return num;
}
int main() {
	cin >> n >> k >> (s + 1); 
	for(int i = 1; i <= n; i++)
		for(int j = i; j <= n; j++)
			a[i][j] = value(i, j);
	for(int i = 1; i <= n; i++)
		dp[i][0] = a[1][i];
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= k; j++)
			for(int l = 1; l < i; l++)
				dp[i][j] = mx(dp[i][j], dp[l][j - 1] * a[l + 1][i]);
	dp[n][k].print();
	return 0;
}
2023/5/1 20:53
加载中...