fork download
  1. fun main(args: Array<String>) {
  2. if(args.isNotEmpty()) {
  3. System.setIn(java.io.FileInputStream(args[0]))
  4. }
  5.  
  6. val numTests = readLine()!!.toInt()
  7. require(numTests in 1..5)
  8.  
  9. var sumN = 0
  10. repeat(numTests) {
  11. val (N, K) = readLine()!!.split(" ").map{ it.toInt() }
  12. require(N in 1..20)
  13. require(K in 3..N)
  14.  
  15. sumN += N
  16. require(sumN <= 20)
  17.  
  18. val W = List(N) { readLine()!!.split(" ").map{ it.toInt() } }
  19. require((0 until N).all{ W[it][it] == 0 })
  20. require((1 until N).all{ i -> (0 until i).all{ j -> W[i][j] == W[j][i] } })
  21. require((1 until N).all{ i -> (0 until i).all{ j -> W[i][j] in 1..1000000 } })
  22.  
  23. val edgesum = IntArray(1 shl N)
  24. for(mask in 1 until (1 shl N)) {
  25. val i = Integer.bitCount(Integer.lowestOneBit(mask) - 1)
  26. var sum = 0
  27. for(j in 0 until N) if((mask shr j) and 1 == 1) sum += W[i][j]
  28. edgesum[mask] = edgesum[mask xor (1 shl i)] + sum
  29. }
  30.  
  31. // 3^(N-K) * (K-2) <= 3^17
  32. val dp = IntArray(1 shl (N-K)) { mask -> edgesum[(mask shl K) or 1] }
  33. for(u in 1 until K) {
  34. for(mask in (1 shl (N-K)) - 1 downTo 0) {
  35. var submask = mask
  36. var now = dp[mask]
  37. while(submask > 0) {
  38. now = maxOf(dp[mask xor submask] + edgesum[(submask shl K) or (1 shl u)], now)
  39. submask = (submask - 1) and mask
  40. }
  41. dp[mask] = now
  42. if(u == K-1) break
  43. }
  44. }
  45. println(W.map{ it.sum() }.sum() / 2 - dp.max()!!)
  46. }
  47. }
Runtime error #stdin #stdout #stderr 0.08s 34088KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Exception in thread "main" kotlin.KotlinNullPointerException
	at ProgKt.main(prog.kt:6)