【问题标题】:Maximize the summation Operation最大化求和运算
【发布时间】: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 的子序列,而不是继续更新最大值。 此代码通过了一些测试用例,但有些给出了错误的答案。

谁能帮助我在我的代码中做错了什么或为这个问题提出更好的方法?

【问题讨论】:

标签: c++ arrays algorithm number-theory


【解决方案1】:

我们将通过以下观察形成的 2-D Dimensional Dp 表:

我们必须取两个值之间的最大值:(dp[i-1][j-1]+(arr[j-1]*(i%m)),dp[i][j-1 ])

其中 arr 是数组,即 [4 9 8 2 6 7 4],dp 是二维 DP-Table。

DP 表以行作为 k 的值(从 0 到 k)和列作为数组的元素给出。

DP| 0 | 4 | 09 | 08 | 02 | 06 | 07 | 04


00 || 0 | 0 | 00 | 00 | 00 | 00 | 00 | 00

01 || 0 | 4 | 09 | 09 | 09 | 09 | 09| 09

02 || 0 | 0 | 22 | 25 | 25 | 25 | 25| 25

03 || 0 | 0 | 00 |22 | 25 | 25 | 25| 25

04 || 0 | 0 | 00 |00 | 24 | 26 | 32 | 32

以下 python 代码通过了 cmets 中讨论的所有测试用例:

n = 7
k = 4 
m = 3
arr = [49999, 4999, 4999, 4999, 99999, 99999, 49999]

# Initialising 2-D DP with 0 of size (k+1)*(n+1) 
# Extra rows for handling edge cases
dp = [[0 for i in range(n+1)] for j in range(k+1)] 

for i in range(1,k+1):
    for j in range(i,n+1):
        ans = max(dp[i-1][j-1]+(arr[j-1]*(i%m)),dp[i][j-1])
        dp[i][j] = ans

# Maximum element at the bottom-right-most of 2-D DP
print(dp[k][n])

感谢@MBo 分享自上而下的方法...

@functools.lru_cache
def mx(i, k):
  if (i < 0 or k == 0):
    return 0
  else:
    return max(mx(i-1, k), (mx(i-1, k-1) + l[i]*(k%m)))

【讨论】:

  • @Bindu Kumari i 的初始值为 length-1(最后一个元素的索引)。请注意,Yash Shah 方法更易于调试。
  • @Bindu Kumari 您的代码可能会导致运行时错误,因为您使用的是幻数 7 和 8,而 data[k+1][n+1] 是正确的方式
猜你喜欢
  • 1970-01-01
  • 2022-11-03
  • 2014-03-27
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多