ASYMTILING
2014-09-21 20:38:15

제한 조건이 있는 경우 제한 조건까지 충족하며 memoization 을

할 수 없는 경우, 제한 조건 없는 것에서 제한 조건 있는 경우를

빼는 방법도 있음.

#define MOD 1000000007

int arr[100];

int cache[101];

int tile(int remain){

    if(remain <= 1)    return 1;

    int &ret = cache[remain];

    if(ret != 0){return ret;}

    ret = (tile(remain-1)%MOD) + (tile(remain-2)%MOD);

    ret = ret % MOD;

    return ret;

}

int atile(int remain){

    //홀수라면

    if(remain %2 ==1){

        return (tile(remain) - tile(remain/2) + MOD)%MOD;

    }

    //짝수 라면

    int ret = tile(remain);

    ret = (ret - tile(remain/2) + MOD)%MOD;//가운데가 없는 것도 빼고

    ret = (ret - tile(remain/2-1) + MOD)%MOD;//가운데가 누워 있는 것도 빼고.

return ret;

}

int main(){

    //printf("The Number is %d

",tile(2));

    for(int i=0;i<101;i++){

            cache[i] = 0;

    }

    printf("The Number is %d

",atile(2));

    for(int i=0;i<101;i++){

            cache[i] = 0;

    }

    printf("The Number is %d

",atile(4));

    for(int i=0;i<101;i++){

            cache[i] = 0;

    }

    printf("The Number is %d

",atile(5));

    for(int i=0;i<101;i++){

            cache[i] = 0;

    }

    printf("The Number is %d

",atile(92));

    return 0;

}

▼ more
역시..;
2014-09-02 23:14:05

뭔가 하지 않을 때는

이 사이트에 아무것도 남기지 않는구나^^;;

▼ more
Fence(divide & conquer) 핵심
2014-08-21 23:22:30

inline int mymin(int a, int b){ return a<b?a:b;}

inline int mymax(int a, int b){ return a>b?a:b;}

int fence[20000];

int cache[20000][20000];

int solve(int left, int right){

    if(left==right){return fence[left];}

    int mid = (left + right)/2;

    int &ret = cache[left][right];

    if(ret != 0){return ret;}

    ret = mymax(solve(left,mid),solve(mid+1,right));

    int l = mid;

    int r = mid+1;

    int height = mymin(fence[l],fence[r]);

    ret = mymax(height*2,ret);

    //ㅣ 이 아직 left보다 크거나 r 이 right 보다 작은 동안 계속 돈다.

    //height 는 가운데 두 개 판자중 낮은 것의 높이부터 시작.

    while(left < l || r < right){

        // r 이 right 보다 작고, l이 이미 left에이미 도달 해서 더 갈 수 없거나 오른쪽 fence 가 더 높을때 오른쪽 으로 간다.

        if(r < right && (l==left || fence[l-1] < fence[r+1])){

            r++;

            height = mymin(fence[r],height);

        }else{

            l++;

            height = mymin(fence[l],height);

        }

        //ret와 지금 가진 좌우 * 높이 중 더 큰것을 취한다.

        ret = mymax(ret, height * ( r - l +1 ));

    }

    return ret;

}

▼ more
슈퍼문이 뜨는 날 ㅎ
2014-08-10 21:43:20

기념 텍스트?

▼ more