AOJ - TRIANGLEPATH

단순한 DP 문제이고, $O(N^2)$ 으로 경로의 최대합을 찾아줄 수 있다.

void solve() {  
   int n;  
   cin >> n;  
   vvi a(n, vi(n));  
   for (int i = 0; i < n; i++) {  
      for (int j = 0; j <= i; j++) {  
         cin >> a[i][j];  
      }  
   }  
   vvi dp(n, vi(n));  
   int ans = 0;  
   dp[0][0] = a[0][0];  
   for (int y = 0; y < n - 1; y++) {  
      for (int x = 0; x < n; x++) {  
         dp[y + 1][x] = max(dp[y + 1][x], dp[y][x] + a[y + 1][x]);  
         dp[y + 1][x + 1] = max(dp[y + 1][x + 1], dp[y][x] + a[y + 1][x + 1]);  
      }  
   }  
   for (int i = 0; i < n; i++) ans = max(ans, dp[n - 1][i]);  
   cout << ans << endl;  
}

Comments