Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

1R/2016 10 07: Difference between revisions

From ZeroWiki
(1)
(Repair pages found by live-compare batch 0001)
 
Line 12: Line 12:
  using namespace std;
  using namespace std;
   
   
  int dp[14*14][1<<15] = { 0, };
  int dp[14*14][1<<15] = { 0, };
  int n, m;
  int n, m;
  int search(int num, int bitma){
  int search(int num, int bitma){
   if(dp[num][bitma]){
   if(dp[num][bitma]){
     if(dp[num][bitma] == -1){
     if(dp[num][bitma] == -1){
       return 0;
       return 0;
     }
     }
     return dp[num][bitma];
     return dp[num][bitma];
   }
   }
   if(num == n * m - 1){
   if(num == n * m - 1){
Line 25: Line 25:
       return bitma;
       return bitma;
     }
     }
     dp[num][bitma] = -1;
     dp[num][bitma] = -1;
     return 0;
     return 0;
   }
   }
   if(bitma & 1){
   if(bitma & 1){
     dp[num][bitma] = search(num + 1, bitma >> 1) % 9901;
     dp[num][bitma] = search(num + 1, bitma >> 1) % 9901;
     if(dp[num][bitma]){
     if(dp[num][bitma]){
       return dp[num][bitma];
       return dp[num][bitma];
     }
     }
     dp[num][bitma] = -1;
     dp[num][bitma] = -1;
     return 0;
     return 0;
   }
   }
   if( num % m != m - 1 && !((bitma >> 1) & 1)){
   if( num % m != m - 1 && !((bitma >> 1) & 1)){
     dp[num][bitma] = search(num + 1, (bitma >> 1) + 1)  % 9901;
     dp[num][bitma] = search(num + 1, (bitma >> 1) + 1)  % 9901;
   }
   }
   if( num < (n-1) * m){
   if( num < (n-1) * m){
     dp[num][bitma] = (dp[num][bitma] + search(num + 1, (bitma >> 1) + (1<<(m-1))))  % 9901;
     dp[num][bitma] = (dp[num][bitma] + search(num + 1, (bitma >> 1) + (1<<(m-1))))  % 9901;
   }
   }
   if(dp[num][bitma]){
   if(dp[num][bitma]){
     return dp[num][bitma];
     return dp[num][bitma];
   }
   }
   dp[num][bitma] = -1;
   dp[num][bitma] = -1;
   return 0;
   return 0;
  }
  }
Line 59: Line 59:
  #include <cstring>
  #include <cstring>
    
    
  int d[14 * 14][1 << 14];
  int d[14 * 14][1 << 14];
  int n, m;
  int n, m;
    
    
Line 67: Line 67:
         return 0;
         return 0;
     }
     }
     if (d[t][s] >= 0) return d[t][s] % 9901;
     if (d[t][s] >= 0) return d[t][s] % 9901;
    
    
     int& res = d[t][s];
     int& res = d[t][s];
     if (s % 2 == 1) res=go(t + 1, s >> 1);
     if (s % 2 == 1) res=go(t + 1, s >> 1);
     else {
     else {
Line 95: Line 95:


== 곽정흠 ==
== 곽정흠 ==

Latest revision as of 14:46, 26 March 2026

오늘의 문제


코드

15이원준

#include<iostream>

using namespace std;

int dp[14*14][1<<15] = { 0, };
int n, m;
int search(int num, int bitma){
  if(dp[num][bitma]){
    if(dp[num][bitma] == -1){
      return 0;
    }
    return dp[num][bitma];
  }
  if(num == n * m - 1){
    if(bitma){
      return bitma;
    }
    dp[num][bitma] = -1;
    return 0;
  }
  if(bitma & 1){
    dp[num][bitma] = search(num + 1, bitma >> 1) % 9901;
    if(dp[num][bitma]){
      return dp[num][bitma];
    }
    dp[num][bitma] = -1;
    return 0;
  }
  if( num % m != m - 1 && !((bitma >> 1) & 1)){
    dp[num][bitma] = search(num + 1, (bitma >> 1) + 1)  % 9901;
  }
  if( num < (n-1) * m){
    dp[num][bitma] = (dp[num][bitma] + search(num + 1, (bitma >> 1) + (1<<(m-1))))  % 9901;
  }
  if(dp[num][bitma]){
    return dp[num][bitma];
  }
  dp[num][bitma] = -1;
  return 0;
}


int main(){
  cin>> n >> m;
  cout << search(0, 0);

}

박인서

#include <iostream>
#include <cstring>
 
int d[14 * 14][1 << 14];
int n, m;
 
int go(int t, int s) {
    if (t >= n*m) {
        if(t == n*m && s == 0) return 1;
        return 0;
    }
    if (d[t][s] >= 0) return d[t][s] % 9901;
 
    int& res = d[t][s];
    if (s % 2 == 1) res=go(t + 1, s >> 1);
    else {
        res = go(t + 1, (s >> 1) | (1 << m - 1));
        if (s % 4 == 0 && t%m != (m - 1)) res+=go(t + 2, s >> 2);
    }
 
    return res % 9901;
}
 
int main() {
    std::cin >> n >> m;
    memset(d, -1, sizeof(d));
    std::cout << go(0, 0);
    return 0;
}

곽정흠

아이디어

15이원준

박인서

  • 비트마스크를 이용한 DP

곽정흠