【发布时间】:2020-11-10 11:12:03
【问题描述】:
给定一个包含 n 个数字和整数 k 和 m 的数组。我们必须选择数组长度为 k 的子序列。给定一个函数s = summation from i=1 to i=k A(i)*(i mod m)。我们必须最大化 s。
约束
n<10000
k<1000
|A(i)| < 10000000
m<10000000
假设数组是4 9 8 2 6 7 4。 k 是 4,m 是 3。对于这种情况,答案是 32。( 9*1 + 8*2 + 2*0 + 7*1 )
我的代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define g_long long long
#define maxx(a, b) a > b ? a : b
int main()
{
ll n, k, m, i, j;
cin >> n >> k >> m;
ll arr[n + 1] =
{ 0 };
for (i = 0; i < n; i++)
{
cin >> arr[i];
}
ll data[8][8] =
{ 0 };
for (i = 1; i <= k; ++i)
{
for (j = 1; j <= 7; ++j)
{
ll ans = maxx((data[i - 1][j - 1] + (arr[j - 1] * (i % m))),
(data[i][j - 1]));
data[i][j] = ans;
}
}
cout << data[k][n];
}
我的方法是首先生成一个长度为 k 的子序列,而不是继续更新最大值。 此代码通过了一些测试用例,但有些给出了错误的答案。
谁能帮助我在我的代码中做错了什么或为这个问题提出更好的方法?
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ arrays algorithm number-theory