2016-07-20 4 views
-1

는 임의의 배열 X [N] [3] 인 가정한다 (경우 N = 3)이 같은 구성 요소를 추가해야2D 배열의 요소를 다음 형식으로 추가하는 알고리즘?

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++에 적합한 의사 코드가 도움이 될 것입니다.

업데이트 : 나는 내가 해결책을 마련하기 위해 전체 어제 헌신하고 내가 좌절있어 도움을 여기 물었다 말씀을 전합니다이 문제를 시도하지 않았다 생각하는 사람들을위한 . 나는 아래의 코드를 함께했다하지만 그건 잘못된 것입니다 : 당신은 그 목적을 위해 std::accumulate을 사용할 수 있습니다

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; 
+1

귀하의 측면에서 시도가 도움이 될 것입니다 (그것이 내가 의미하는 최적의 솔루션되지 않습니다) 모든 가능한 값을 계산하는 없습니다. 그래서 "나를위한 코드를 써주세요"가 아닙니다. 질문은 무엇입니까? – user463035818

+0

"나는이 문제를 시도하지 않았다라고 생각하는 사람들을 위해"- 아무도 적어도 나를 생각하지 않는다. 그럼에도 불구하고 도움을 얻으려면 정확히 어디에서 붙어 있고 문제를 해결하지 못하는지 설명해야합니다. 지금도 나는 현재의 해결책이 잘못된 방법을 우리에게 말하지 않으며 그것이 틀렸다는 것을 어떻게 알았는지 (예 : 기대하고 관찰 된 결과물을 제공하는 것이 도움이 될 것임)를 말하지 않는다고 비판 할 수 있습니다. – user463035818

답변

0

당신이 당신을 도울 것입니다 C# 코드 조각 아래 의사 코드를 요구하고 있기 때문이다. 나는 당신에게 최적화 된 alg를 요구하고있는 wheather를 모른다. 또는 그러나 아래의 코드는

 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; 
     } 
+1

'max'는 입력에서 음의 정수를 얻을 수 있기 때문에 MIN_INT (또는 C#의 해당 부분)로 초기화되어야합니다. – Rerito

+0

@rerito 네, 그 점을 명심하십시오. 문제를 해결하기 위해 단순한 논리가 필요했습니다. 도와 주셔서 감사합니다. –

0

:

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 기능을 사용합니다 : 하위 배열 컨테이너 유형을 지정하는 번거 로움을 피하기 위해 일반적인 람다가 있습니다 (사용하는 컨테이너에 관계없이 코드가 작동하도록).

비회원 시작과 끝 사용에 대한 관심은 선택한 컨테이너에서 자신을 추상화하는 것입니다.

더 간단한 루프 기반 버전 :

#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]; 
} 
+2

미안하지만, 당신의 코드는 현대의 C++ 코드가 단순한 구형 루프보다 훨씬 읽기 쉽고 이해하기 쉬울 수 있다는 좋은 예입니다. – user463035818

+0

@ tobi303 나는 왜 그렇게 생각하는지 확실히 알 수 있습니다. 다른 것과 마찬가지로 장단점이 있습니다. 질문은 C++로 태그가 붙어 있기 때문에 일부 일반성의 이점을 입증하는 것이 흥미로울 것이라고 생각했습니다. – Rerito

-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;