SNAIL문제에서 memset함수 질문!

  • 시나브로
    시나브로

    안녕하십니까! snail문제를 풀다가
    cashe배열의 초기화에서

    memset(cashe,-1,sizeof(cashe));로 초기화하고
    {if(cashe[n][m] != -1){return cashe[n][m];}}로 메모이제이션하면 안되는 이유가 궁금합니다!
    아마도 추측상으로는 자료형의 문제로 생각됩니다...
    IDE에서 출력결과가-NaN으로 나옵니다.. 왜인지 궁금합니다!
    (문제는 반복문 초기화로 풀었습니다!)

    // SNAIL 20190208
    // #알고리즘 #프로그래밍 #종만북 #난이도:하
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    template<typename T>
    void vectorclear(vector<T>& vec_obj)
    {vector<T> temp_obj;
    temp_obj.swap(vec_obj);}
    void stringclear(string& str)
    {string throwawaystr;
    str.swap(throwawaystr);}
    //기본셋
    
    double cashe[1001][1001];
    
    double snail (int n,int m)
    {
    if(n>=0)
    {if(cashe[n][m] != -1){return cashe[n][m];}}
    if(n==m){return cashe[n][m]=1;}
    if(n<=0){return cashe[n][m]=1;}
    if(m==0){return cashe[n][m]=0;}
    double k = ((0.75) * snail(n-2,m-1))+((0.25) * snail(n-1,m-1));
    return cashe[n][m]=k;
    }
    
    int main() 
    {
    int C;
    cin>>C;
    while(C--)
    {
    //memset(cashe,-1,sizeof(cashe));
    for(int i=0;i<1001;i++)
    {for(int j=0;j<1001;j++)
    {cashe[i][j]= -1;}}
    int m,n;
    cin>>n>>m;
    cout.precision(10);
    cout<<snail(n,m)<<endl;
    
    }
    return 0;   
    }
    

    5년 전
2개의 댓글이 있습니다.
  • SteelFox
    SteelFox

    memset(void *dst, int Val, size_t size) 함수는 dst변수의 주소로부터 *dst + Size 만큼의 공간에 Val값을 'byte 단위'로 초기화합니다. 변수에 0 또는 -1로 초기화를 하면 모든 byte에 0 또는 1(-1은 2의 보수로 모든 bit가 1이 됨)로 채울 수 있기 때문에 초기화하는 데에 사용할 수 있지만, 그 외 다른 값을 사용하면 Val값으로 초기화가 되지 않지요. double은 floating point로 값을 읽기 때문에 당연히 byte단위로 초기화를 하면 값이 정상적으로 초기화되지 않지요. byte단위로 할당된 값을 확인해보면 모든 bit이 1로 정상적으로 할당은 됨을 확인할 수 있습니다. memset은 int 아니면 char에만 쓴다고 생각하시면 됩니당
    아니면 fill(cache[0], cache[1001], -1)도 써보세요. fill()은 특정 값으로 초기화하는 함수입니다~~


    5년 전 link
  • 시나브로
    시나브로

    친절하신설명 정말 감사합니다!
    fill()을 써봐야겠네요ㅎㅎ


    5년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.