d[100][10]에서 0~9가 모두 나타났는지 확인할 수 있는 상태만 추가해주면 되요.
그러면 d[100][10][1<<10]으로 해결할 수 있어요~
1562번 - 계단 수
d[100][10]에서 0~9가 모두 나타났는지 확인할 수 있는 상태만 추가해주면 되요.
그러면 d[100][10][1<<10]으로 해결할 수 있어요~
이해가 잘 안가네요
d[100][10][1024]; 3차원 배열로 하라는 말씀이신가요?
d[100][10][1024] 맞구요. 1024는 숫자가 방문 했는지 비트로 저장하면 됩니다.
정말 죄송한데
제가 대학에서 컴공을 전공한게 아니라서
비트연산자를 응용하는법을 잘 모르겠습니다
아이디어가 간단하면 조금만 더 설명해주시고
조금 길다면 어느 부분을 공부해야하는지 말해주실수있나요 ??
9876543210에 방문한 애들을 표기하는 겁니다. 안했으면 0 방문했으면 1 다시방문해도 계속 1인거죠.
만약 3, 2, 1을 방문했다고 하면 0000001110으로 표현할 수 있습니다.
이는 2진수니까 이를 10진수로 표현하면 2+4+8=14가 되겠죠
그럼 이걸 왜 활용하냐면 |(or연산)의 경우 0|1이면 1이잖아요
그러니까 다음에 들어오는 숫자와 지금까지 방문한 정보를 비트로 저장해서 서로 or 연산해버리면
방문한 정보를 담고 있을 수 있게됩니다.
비트가 0부터 9까지 10개 필요하니까 2^10=1024로 나타낼 수 있는거죠.
그리고 14라는 숫자가 표현하는게 2, 4, 8을 방문했다는 유일한 정보입니다.
즉, 14라는 숫자는 다른 2,4,8말고 다른 숫자를 방문했다는 정보를 가질 수가 없죠..
d[n][x][a] = n이라는 길이의 계단수 맨 마지막 숫자가 x로 끝날때 a라는 비트 정보를 가지고 있는 방법의 수
d[n][x][bit|x] += d[n-1][x-1][bit]
이런식으로 bit가 가질 수 있는 모든 수 1, 3(1+2), 7(1+2+4), 15(1+2+4+8+...), ... 즉 10개의 수에 대해서만 체크해줍니다. (반복문 10번 돌리면 될 듯)
상세한 답변 감사합니다 ㅠㅠ
차근차근읽어보고 완성해볼게요
항상 배우고 갑니다.
와 풀었습니다.
알아가면 알아갈수록 재밌네요
감사합니다 ^^
위에 어떻게 코드를 작성하려고 하셨는지 잘 이해가 안갑니다. ㅎ;;
그래서 그냥 제가 푼 방법을 설명해 드릴게요.
제가 위에서 언급했던 방법은 각각 다른 방법입니다.
마지막에 언급했던 d[m][x][bit]는
m번째 인덱스부터 맨 마지막 인덱스까지의 계단수가 x로 시작하고(즉, m번째 인덱스가 x일 때) bit라는 정보를 가지고 있는 경우의 수 입니다.
즉, 처음 언급했던 d[m][x][bit]는 m이 감소하는 방향으로 체크가 되지만 마지막에 언급했던 방법은 m이 증가하는 방향으로 체크가 됩니다.
아무튼... 마지막에 언급했던 것을 점화식으로 표현해보면,
d[m][x][bit] = d[m+1][x-1][bit|mask1] + d[m+1][x+1][bit|mask2];
이렇게 됩니다.
x-1이 0일 때 mask1을 1로 해주시고,
x+1이 9일 때 mask2를 2로 해주시면
9번에 닿았을때 bit값이 2로 유지가 되고, 0에 닿았을때 2로 유지되던 bit값에 1이라는 정보가 추가되어 3이 될 수 있습니다. (반대방향으로도 마찬가지지요)
그럼 나중에 확인할 때에는 bit == 3인 애들만 모아서 x=1~9까지 더해주면 답이 됩니다.
댓글을 작성하려면 로그인해야 합니다.
nisroeld99 8년 전 1
https://www.acmicpc.net/problem/10844
이건 쉽게 풀었는데요
d[100][10] 잡아서 가장끝 값으로 ..
이건 시작점까지 잡아야될거같은데
그럼 9*10 해서 너무 경우가 많아지네요 (가능은 할거같은데 노가다가..)
이거말고 다른 dp접근법좀 조언해주세요