假设任意数组X [N] [3]为(如果N = 3):
18 7 6
23 10 27
20 9 14
我需要添加以下元素:
18+7+6=31, 18+23+10+27=78, 18+23+20+9+14=84
然后我需要找到最大值。在上述情况下,它是84。我应该如何解决这个问题?适合C ++的伪代码会有所帮助。
更新 对于那些认为我没有尝试过这个问题的人,我想说我昨天全力以赴提出解决方案,我感到很沮丧,并在这里寻求帮助。我想出了下面的代码,但这是错误的:
for(int k=0; k<N; k++){
for(int i=0;i<N;i++){
if(i<N-1-k){
t=t+X[i][0];
}
else{
for(int j=0;j<3;j++){
t=t+X[i][j];
if(answer<t){
answer=t;
}
}
}
}
t=0;
}
cout<<answer;
答案 0 :(得分:0)
您可以将std::accumulate
用于此目的:
int array[][3] = { {18, 7, 6}, {23, 10, 27}, {20, 9, 14} };
auto partial_sum = 0;
auto result = std::accumulate(std::cbegin(array), std::cend(array), std::numeric_limits<int>::min(),
[&partial_sum](int result, auto const& subarray) {
auto new_result = partial_sum
+ std::accumulate(std::cbegin(subarray), std::cend(subarray), 0);
partial_sum += *std::cbegin(subarray);
return std::max(new_result, result);
});
std::cout << result << '\n';
Coliru上的现场演示。
请注意,我使用的是C ++ 14特性:有一个通用的lambda可以避免指定子数组容器类型的麻烦(这样无论你使用哪个容器,代码都可以工作)。
使用非成员开始和结束的兴趣是从所选容器中抽象出来。
更简单的基于循环的版本:
#define N 3
int array[N][3] = { {18, 7, 6}, {23, 10, 27}, {20, 9, 14} };
int partial_sum = 0;
int result = std::numeric_limits<int>::min();
for (int i = 0; i < N; ++i) {
int row_sum = 0;
for (int j = 0; j < 3; ++j) {
row_sum += array[i][j];
}
result = std::max(row_sum + partial_sum, result);
partial_sum += array[i][0];
}
答案 1 :(得分:0)
由于你要求下面的伪代码c#代码片段会帮助你。我不知道你要求优化的alg。或不是,但下面的代码是计算所有可能的值(这不是我的意思的最佳解决方案)
int[,] m = new int[3, 3] { { 18, 7, 6 }, { 23, 10, 27}, { 20, 9, 14 } };
int max = Int32.MinValue;
for (int i = 0; i < N; ++i)
{
int firstColl = 0;
for (int j = 0; j < i+1; ++j)
{
firstColl += m[j, 0];
}
int value = firstColl + m[i, 1] + m[i, 2];
if (max < value)
max = value;
}
答案 2 :(得分:-1)
int add = 0;
int sum = 0;
int max = 0;
for(int i = 0; i<n;i++){
add+=arr[i][0];
sum = add;
for(int j=1;j<n;j++){
sum+=arr[i][j];
}
if(max<sum){
max = sum;
}
}
cout<<max;