最大化这个方程 E[a1]-E[a2]+E[a3]-E[a4] [关闭]

Posted

技术标签:

【中文标题】最大化这个方程 E[a1]-E[a2]+E[a3]-E[a4] [关闭]【英文标题】:Maximize this equation E[a1]-E[a2]+E[a3]-E[a4] [closed] 【发布时间】:2021-11-12 17:35:40 【问题描述】:

谁能帮我解决这个问题

我们必须最大化以下方面的价值: E[a1]- E[a2]+ E[a3]- E[a4] 其中 E 是一个数组 约束: 1

N>=4

a1>a2>a3>a4(索引)

输入格式

N(数组中的整数个数)

N个值用空格隔开

输出

单个整数(最大值)

测试用例: 输入/输出

6

3 9 10 1 30 40

O/P

46(40-1+10-3)(指数:5>3>2>0)

【问题讨论】:

到目前为止您尝试了哪些方法,您在哪里遇到了问题? 40-1+10-3 是 46,而不是 47。 我使用了分而治之的算法,但它不起作用我卡住了 【参考方案1】:

最好分解这个问题,从较小的案例开始。 我们如何将E[i]- E[j] 最大化为i > j?对于每个索引 i,我们可以跟踪数组 one_diffi 之前的 E 中的最小值,其中 one_diff[i] = min(E[0], E[1], ... E[i-1])。那么,对于给定的 i,E[i]- E[j] 的最大值就是 E[i] - one_diff[i]

对于三个术语,固定i 的最大E[i]- E[j] + E[k]E[i] - min(E[j] - E[k]) over all j < i and k < j。这里的子问题实际上与上一个问题相同,只是我们现在想要给定 j 的 E[j]- E[k] 的最小值,因此将每个最大值更改为最小值。

对于四个术语,E[i]- E[j] + E[k] - E[l] 的最大值需要E[j]- E[k] + E[l] 的最小值,对于固定的j,变量k, ll < k < j,所以进展与从两到三个术语相同.

n 变量的动态规划中,您应该首先尝试根据带有n-1 变量的子问题编写答案,然后解决该子问题。

【讨论】:

谢谢,但我无法实现分而治之的算法,最后我使用了 dp,它成功了【参考方案2】:
#include <bits/stdc++.h>

using namespace std;

int main()

int n;

cin>>n;

vector<int> v(n);

for(int i=0; i<n; i++) 

cin>>v[i];

vector<int> a1(n);

vector<int> a2(n);

vector<int> a3(n);

vector<int> a4(n);

int max4 = (-1)*v[0];

for(int i=0; i<n; i++)

    max4 = max(max4, (-1)*v[i]);
    a4[i] = max4;


int max3 = v[1]-v[0];
for(int i=1; i<n; i++)

    max3 = max(max3, v[i]+a4[i-1]);
    a3[i] = max3;


int max2 = (-1)*v[2]+v[1]-v[0];
for(int i=2; i<n; i++)

    max2 = max(max2, (-1)*v[i]+a3[i-1]);
    a2[i] = max2;


int max1 = v[3]-v[2]+v[1]-v[0];
for(int i=3; i<n; i++)

    max1 = max(max1, v[i]+a2[i-1]);
    a1[i] = max1;

cout<<a1[n-1]<<endl;
return 0;    

由于没人愿意回答,所以我自己用 dp 回答了

【讨论】:

这不是和我说的DP策略很像吗?此外,如果您将除最后一个循环之外的所有循环都更改为 min() 操作,我认为您可以避免所有乘法 (-1)。变化不大,但可以使代码更短/更干净,更容易泛化

以上是关于最大化这个方程 E[a1]-E[a2]+E[a3]-E[a4] [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SLAM中的变换(旋转与位移)表示方法

在Visual C ++中有没有办法增加变量[A1,A2,A3…]?

E - Huge Mods (UVA - 10692)

python怎么实现trace功能

二元一次方程组

二元一次方程组