for (int i = 2; i <= 18; i++){
for(int a = 0; a <= 18; a++){
for(int b = 0; b <= 18; b++){
dp[i][a][b] += dp[i - 1][a - 1][b - 1] * p * q;
dp[i][a][b] += dp[i - 1][a][b - 1] * (1 - p) * q;
dp[i][a][b] += dp[i - 1][a - 1][b] * p * (1 - q);
dp[i][a][b] += dp[i - 1][a][b] * (1 - p) * (1 - q);
}
}
}
이 코드대로 가면 a = 0일 때 a - 1때문에 음수가 되는데
따로 예외처리를 안해도 답이 나오던데
대충 음수면 무시하기로 컴파일러가 해석한거임?
undefined behavior지만 일반적으로 배열의 전 주소의 값을 건드리는 식으로 계산댐 *(ptr - 1) - dc App
undefined behavior 아님. a[b]는 정확히 *(a+b)와 동치임. 다차원 배열은 일차원 배열과 동일하게 작동하고 결국 syntactic sugar.
ㄹㅇ??? 몰랐음 제가 틀렸네… - dc App
근데 i가 음수면 언디파인 맞지 않음? 이 코드에서 음수될 a가 2차원이라 상관없어보이는데
gpt한테 물어보면 undefined 라는데
ub 맞음
https://stackoverflow.com/q/72909121
stackoverflow 사례랑 이 사례랑 다름. 글쓴이는 지금 최고로 낮게 잡은게 dp[1][-1][-1] 이잖슴. 이건 dp[1*n*m+ -1*m+-1] 돼서 적당히 사용하지 않는 dp 배열 값 중 하나인 0이 됨.
i가 음수여도 a와 b가 엄청 커서 계산된 메모리가 배열 범위 안이라면 잘 참조됨
일반적으로 ub맞음. 아닌 경우는 int a++처럼 static하게 선언했을 경우엔 그럴 수 있을 듯.
내 댓글을 읽긴 읽음? UB 아님ㅋㅋㅋ UB인 경우는 선언되지 않은 메모리를 참조했을 때임
아 어떤 느낌인지 알거같음.. 근데 여기서 ab를 크게잡는다는건 원래 배열크기를 크게잡는단거임 아님 원래 배열크기에 비해서 ab를 존나 크게 잡는단거임?
원래 배열 크기에 대한 a,b지. 예를 들어 2차원 배열 6x5에서 arr[-2][20] 같은건 *(&arr[0][0]+ (-2)*5 + 20) == *(&arr[0][0]+10) == arr[2][0]
arr[i]가 *(arr + i)와 동치인 건 C에서나 그런 거고 C++에선 C 스타일 배열 한정임
117.111 스펙 읽어보셈. 내가 놓쳤을 수도 있긴 한데 일단 "... dp[1][-1][-1] 이잖슴. dp[1*n*m+ -1*m+-1] 돼서..."는 직접적인 근거가 없음. 보통 배열 arr[A][B][C]가 arr[A*B*C]처럼 만들어지고, 이게 스팩에 근거한 것 까지는 ([dcl.array] 6) 맞는데, 이게 배열 참조를 저렇게 해도 된다는 근거는 아니라고 생각함.
[dcl.array] Example 4에 다차원 배열을 접근하는 예시가 있고, [expr.sub]에서 E1[E2]의 정의가 *((E1)+(E2))라고 되어 있는데, [expr.add] (4.2)와 (4.3)에서 배열 원소 가리키는 포인터는 0 <= i+j <= n 범위 밖인 결과는 undefined behavior임이 명시되어 있음. 그래서 dp[1][-1]은 UB임.
[dcl.array]
https://timsong-cpp.github.io/cppwp/n4950/dcl.array
[expr.sub]
https://timsong-cpp.github.io/cppwp/n4950/expr.sub
[expr.add]
https://timsong-cpp.github.io/cppwp/n4950/expr.add
[dcl.array]의 Example 4의 "multiplying i by the length of the object to which the pointer points"는 일반적인 구현법을 서술하는 것이지, 표준이 아님에 유의
읽어보겠음 ㄱㅅㄱㅅ
https://stackoverflow.com/a/7787436
그르네
인정함.
배열을 좀 크게 잡았나봐
그냥 UB - dc App