티스토리 뷰

알고리즘/BOJ

[백준] 17498 폴짝 게임

세진짱 2019. 11. 8. 14:25

 

DP로 풀 수 있는 문제다!

d[N*M]로 테이블을 잡아보자

d[pos] = 계산값 + d[pos+|d|]로 칸에서의 최대값을 저장하며 풀어나가보자

이 때 최대값이 음수값으로 나올 수 있으므로 inf값을 잘 설정해야한다

 

소스코드

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
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define ll long long
const int SIZE = 200005;
ll inf = 1e12;
ll d[SIZE];
ll arr[SIZE];
int n,m,k;
 
bool inner(int x,int y){
    return (0<=&& x<&& 0<=&& y<m);
}
ll solve(int pos) {
    if(pos>=n*m) return -inf;
    int x = pos/m;
    int y = pos%m;
    if(x==n-1return 0;
    ll&ret = d[pos];
    if(ret != -inf) return ret;
    for(int i=x;i<=x+k;i++){
        for(int j=y-k;j<=y+k;j++){
            if(inner(i,j) && x<&& (abs(i-x)+abs(j-y)<=k)){
                ret = max(ret,arr[pos]*arr[i*m+j]+solve(i*m+j));
            }
        }
    }
    return ret;
}
 
int main(){
    for(int i=0;i<SIZE+1;i++) d[i]= -inf;
    scanf(" %d %d %d",&n,&m,&k);
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            scanf(" %lld",&arr[i*m+j]);
        }
    }
    ll ans=-inf;
    for(int i=0;i<m;i++) ans = max(ans,solve(i));
    printf("%lld\n",ans);
}
 
 

'알고리즘 > BOJ' 카테고리의 다른 글

[백준] 17503 맥주 축제  (0) 2019.11.08
[백준] 17499 수열과 시프트 쿼리  (0) 2019.11.08
[백준] 17497 계산기  (0) 2019.11.08
[백준] 16438 원숭이 스포츠  (0) 2019.09.20
[백준] 16441 아기돼지와 늑대  (0) 2019.09.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함