use proconio::{input, marker::Usize1}; fn main() { input! { n: usize, m: usize, k: usize, a: [Usize1; k], t: [[usize; n]; n], } let mut is_goal = vec![false; n]; for &a in &a { is_goal[a] = true; } let inf = 1usize << 60; let mut dp = vec![vec![inf; n]; 1 << n]; for i in 0..n { dp[1 << i][i] = 0; } let mut ans = inf; for bits in 0usize..1 << n { for i in 0..n { if bits >> i & 1 == 0 { continue; } if bits.count_ones() as usize >= m && is_goal[i] { ans = ans.min(dp[bits][i]); } for j in 0..n { if bits >> j & 1 == 1 { continue; } let nbits = bits | 1 << j; dp[nbits][j] = dp[nbits][j].min(dp[bits][i] + t[i][j]); } } } println!("{}", ans); }