ps | |
---|---|
링크 | acmicpc.net/… |
출처 | BOJ |
문제 번호 | 1521 |
문제명 | 랜덤 소트 |
레벨 | 플래티넘 5 |
분류 |
DP |
시간복잡도 | O(n^2 * n!) |
인풋사이즈 | n<=8 |
사용한 언어 | Python 3.11 |
제출기록 | 40988KB / 424ms |
최고기록 | 424ms |
해결날짜 | 2023/07/15 |
"""Solution code for "BOJ 1521. 랜덤 소트".
- Problem link: https://www.acmicpc.net/problem/1521
- Solution link: http://www.teferi.net/ps/problems/boj/1521
Tags: [dp]
"""
import functools
@functools.cache
def solve_rec(nums):
l = list(nums)
count = 0
tot_swap = 0.0
for i, nums_i in enumerate(nums):
for j in range(i + 1, len(nums)):
if nums_i > nums[j]:
count += 1
l[j], l[i] = l[i], l[j]
tot_swap += 1 + solve_rec(tuple(l))
l[j], l[i] = l[i], l[j]
return tot_swap / count if count > 0 else 0.0
def main():
N = int(input()) # pylint: disable=unused-variable
nums = [int(x) for x in input().split()]
print(solve_rec(tuple(nums)))
if __name__ == '__main__':
main()