[BOJ] #2169 λ‘λ΄ μ‘°μ’ νκΈ°
μκ° μ ν | λ©λͺ¨λ¦¬ μ ν | μ λ΅ λΉμ¨ |
2 μ΄ | 512 MB | 31.977% |
2169λ²: λ‘λ΄ μ‘°μ’ νκΈ°
첫째 μ€μ N, M(1≤N, M≤1,000)μ΄ μ£Όμ΄μ§λ€. λ€μ Nκ°μ μ€μλ Mκ°μ μλ‘ λ°°μ΄μ΄ μ£Όμ΄μ§λ€. λ°°μ΄μ κ° μλ μ λκ°μ΄ 100μ λμ§ μλ μ μμ΄λ€. μ΄ κ°μ κ·Έ μ§μμ κ°μΉλ₯Ό λνλΈλ€.
www.acmicpc.net
λ°©λ²
λ‘λ΄μ΄ 'μλμ μ€λ₯Έμͺ½'μΌλ‘ κ°λ κ²κ³Ό 'μλμ μΌμͺ½'μΌλ‘ κ°λ κ² λ λ°©λ²μ κ°κ° ꡬν΄μ λ ν° κ°μΌλ‘ dp λ°°μ΄μ μ±μλκ°λ€.
μμλ.. dpλ ν΅μ°°λ ₯!! ν΅μ°°λ ₯μ ν€μ°μγ γ
λ©λͺ¨λ¦¬ | μκ° |
9012 KB | 124 ms |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
#define INF -1000000
int arr[1005][1005];
int dp1[1005][1005];
int dp2[1005];
int n, m;
int main(void)
{
scanf("%d %d", &n, &m);
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
dp1[i][j] = INF;
}
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &arr[i][j]);
dp1[1][0] = 0;
for (int j = 1; j <= m; j++)
dp1[1][j] = dp1[1][j - 1] + arr[1][j];
for (int i = 2; i <= n; i++) {
for (int j = 0; j <= m+1; j++)
dp2[j] = INF;
for (int j = 1; j <= m; j++) {
dp1[i][j] = max(dp1[i][j - 1], dp1[i - 1][j]) + arr[i][j];
}
for (int j = m; j >= 1; j--) {
dp2[j] = max(dp2[j + 1], dp1[i - 1][j]) + arr[i][j];
}
for (int j = 1; j <= m; j++) {
dp1[i][j] = max(dp1[i][j], dp2[j]);
}
}
printf("%d\n", dp1[n][m]);
return 0;
}
|
cs |
1μ°¨μ λ°°μ΄ 3κ°λ‘ λλ΄λ λ°©λ²!
λ§μ μ¬λ μ½λλ₯Ό 보면μ λ ν λ² λ°°μ°κ² λλ€.. λ©μ§ μ¬λλ€
μ΄ λ°©λ²μ κ°μ€μΉλ₯Ό λ°μΌλ©΄μ λμμ μ°μ°μ νλλ°, λ°°μ΄ B κ° 'μλμ μ€λ₯Έμͺ½'μΌλ‘ μ΄λνλ κ°μ€μΉμ ν©, Aκ° 'μλμ μΌμͺ½'μΌλ‘ μ΄λν λμ κ°μ€μΉκ° λλ€.
λ©λͺ¨λ¦¬ | μκ° |
1128 KB | 116 ms |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int dp[1000], A[1000], B[1000];
int n, m;
int main(void){
scanf("%d%d", &n, &m);
fill(dp + 1, dp + m, (int)-1e9);
dp[0] = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &A[j]);
B[j] = (j && B[j - 1] > dp[j] ? B[j - 1] : dp[j]) + A[j];
}
for (int j = m - 1; j >= 0; j--)
A[j] += j<m - 1 && A[j + 1]>dp[j] ? A[j + 1] : dp[j];
for (int j = 0; j < m; j++)
dp[j] = max(A[j], B[j]);
}
printf("%d", dp[m - 1]);
return 0;
}
|
cs |