λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 3980번 - μ„ λ°œ λͺ…단

by μ•ˆμ£Όν˜• 2022. 8. 21.

문제

3980번: μ„ λ°œ λͺ…단

각각의 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ, λͺ¨λ“  ν¬μ§€μ…˜μ˜ μ„ μˆ˜λ₯Ό 채웠을 λ•Œ, λŠ₯λ ₯치의 ν•©μ˜ μ΅œλŒ“κ°’μ„ ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€. 항상 ν•˜λ‚˜ μ΄μƒμ˜ μ˜¬λ°”λ₯Έ 라인업을 λ§Œλ“€ 수 μžˆλ‹€.

www.acmicpc.net

μ½”λ“œ

#include <iostream>
#include <memory.h>

using namespace std;

int map[11][11];
int ans;
int visited[11];

void dfs(int peo, int sum){
    
    if(peo == 11){
        ans = max(ans, sum);
        return;
    }
    
    for(int i=0; i<11; i++){
        if(map[peo][i] && !visited[i]){
            visited[i] = 1;
            dfs(peo+1, sum + map[peo][i]);
            visited[i] = 0;
        }
    }
    
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int T; cin>>T;
    while(T--){
        for(int i=0; i<11; i++){
            for(int k=0; k<11; k++){
                cin>>map[i][k];
            }
        }
        
        dfs(0,0);
        cout<<ans<<'\n';
        ans = 0;
        memset(visited, 0, sizeof(visited));
    }
}

풀이

11λͺ…μ˜ μ„ μˆ˜κ°€ ν¬μ§€μ…˜μ„ μ„ νƒν–ˆμ„ λ•Œ κ·Έ ν¬μ§€μ…˜μ˜ 점수의 합이 μ΅œλŒ€κ°€ λ˜λŠ” 값을 좜λ ₯ν•˜λŠ” μ „ν˜•μ μΈ backtracking λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€. λ”°λ‘œ 크게 λΆ€μ—°μ μœΌλ‘œ μ„€λͺ…ν•  뢀뢄은 μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

λŒ“κΈ€