题目要求给定一个长度为n的序列a_i,每次可以从序列中选择一个数b,使得A = A + b或者A = A * b,最终要求最大化A对998244353取模的值。
这个问题可以使用动态规划来解决。我们定义一个二维数组dp,其中dp[i][j]表示选择前i个数使用了j次加法操作时的最大值。状态转移方程如下:
dp[i][j] = max(dp[i-1][j-1]*a[i], dp[i-1][j]+a[i])
其中,dp[i-1][j-1]*a[i]表示选择第i个数乘法操作,dp[i-1][j]+a[i]表示选择第i个数加法操作。
最终结果就是dp[n][n/2],即选择前n个数使用n/2次加法操作时的最大值。
下面是完整的C++代码实现:
- #include <iostream>
- #include <vector>
- using namespace std;
- const int MOD = 998244353;
- int main() {
- int n;
- cin >> n;
- vector<int> a(n+1);
- for (int i = 1; i <= n; ++i) {
- cin >> a[i];
- }
- vector<vector<int>> dp(n+1, vector<int>(n/2+1));
- dp[0][0] = 0;
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= n/2; ++j) {
- dp[i][j] = max(dp[i-1][j-1]*a[i], dp[i-1][j]+a[i]);
- dp[i][j] %= MOD;
- }
- }
- cout << dp[n][n/2] << endl;
- return 0;
- }
复制代码
希望能帮到你!如果还有其他问题,尽管问。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。