이번주 썰전 못봐서 틀어놓고 쿨쿨 잤다능 ...
초기조건주는게 조금 특이했던 문제로 기억합니다.
혹시 못푸셨으면 소스 올려드릴태니까 참고하쉬귈
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <stdio.h> #define mod 1000000 int cash[101][101][2]; int makeans(int low, int high, bool order) { if ((low == 0) && (high == 0)) { return 1; } if (order) { if (high == 0) { return 0; } } else { if (low == 0) { return 0; } } int& ret = cash[low][high][order]; if (ret != -1) { return ret; } ret = 0; if (order) { for (int i = 0; i < high; i++) { ret = (ret + makeans(low + i, high - i - 1, !order)) % mod; } } else { for (int i = 0; i < low; i++) { ret = (ret + makeans(low - i-1, high + i, !order)) % mod; } } return ret; } int main() { int n; int ans=0; int first; scanf("%d", &n); for (int i = 0; i <= n; i++) { for (int j = 0; j <= n; j++) { cash[i][j][0] = -1; cash[i][j][1] = -1; } } if (n == 1) { ans = 1; } else if (n == 2) { ans = 2; } else { for (int i = 1; i <= n; i++) { first = i; for (int j = 1; j <= n; j++) { if (first == j) { continue; } else if (first < j) { ans = (ans + makeans(j - 2, n - j, 0)) % mod; } else if (first > j) { ans = (ans + makeans(j - 1, n - j - 1, 1)) % mod; } } } } printf("%d\n", ans); return 0; } | cs |
부지런도 하여라.
if ( n < 3 ) ans = n; else ?
헿 어쩌다보니 부지런한 날이 됬네요
if ~ continue 는 사족.
넴 그렇게 해도 똑같네요 ㅋㅋ 제가 사고한걸 단순히 코드로 표현하려다보니 저런 군살들이 ... ㅜㅜ
돼지코드 ㅜㅜ
아냐 그냥 한번 안 걸러서 그런거지.
음 그리고 위의 DP 제너레이팅 함수. 그냥 아래 for 문에서 1과 0으로 채워줬으면
조건문 앞부분 다날아갔을텐데
걍 ret 리턴으로 걸러졌을거잖.
코드 다이어트 해 갑니다. ㅋㅋ
그리고 성능을 생각한다면 참조가 아닌 임시 변수로 ret 를 복사해서 이터레이션을 끝내고 대입하는 구조로 가야.
makeans함수에서 하는 기저처리를 미리 해놓으란 말씀이시군요. 그렇게 하는 방법이 실행속도 면에서 훨씬 좋겠네요. ㅇㅎ! 다음에 dp풀때 참고해야 겠습니다. 감사합니다.
아 이건 재귀라 다르겠군.
나같으면 order 홀수 함수랑 짝수 함수 나눠서 서로 부르게 만들었을 것 같아.
그러면 order 가 필요없지. 당연히 싸지.
음 그럼 함수에서 int ret = cash[low][high][order] 이렇게 받고 return 전에 cash[low][high][order] = ret; return ret;
아니 그건 논리적으로 다를수 있어서 냅두구.
이렇게 해주는게 더 빠른건가요? 그새 댓글이 3개나 더 달렸네요 ㄷㄷ ;
일단 하나로 합쳐놓은 함수를 홀수 함수 짝수 함수로 바꿔서 필요없는 order 처리를 다 소거. 파라메터도 하나 줄이세유.
order가 필요한게 오름차순과 내림차순을 나눈 것인데, 똑같은 1,0이어도 오름차순이나 내림차순이냐에 따라서 값이 달라집니다. 제 생각에서 소거가 안될꺼 같은데요..
그니까 네 DP 함수는 세 가지 일을 하고 있었던거지 1. DP 테이블 가장자리 초기화 / 2. 홀수 처리 / 3. 짝수 처리
이걸 홀수처리 함수와 짝수 처리 함수로 나누어주면, 서로 부르면 되잖.
음... 문제는 dp를 할때 오름차순과 내림차순을 저장하는 메모리를 공유하게 된다면 문제가 발생할듯 싶습니다. 이미 오름차순에서 계산해서 메모라이징한 값을 내림차순 함수에서 보고 ret!=-1을 체크해서 리턴할태니까요
내가 다이어트해서 다시 올려볼게유~
함수는 두개로 나누어 주는것이 효율적일듯 싶지만 메모리는 역시 100*100 짜리 두개가 필요할듯 싶습니다.
아긔발//됬->됐 (되어 = 돼임) [리듬 맞춤법 봇♬]
리듬봇누나도 부지런해
근데 몇번째 댓글인지 본문이면 몇번째 줄에서 틀렸는지 봇 업데이트좀 해주면 좋겠어
답글 올림~
ㅇㅇ 구글 검색해서 솔루션 코드 분석하다 감잡음
어렵더라 이런거
고마워요