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

1R/2016 10 13: Difference between revisions

From ZeroWiki
imported>vkdnjdldnjsw
No edit summary
(Repair pages found by live-compare batch 0001)
 
(One intermediate revision by one other user not shown)
Line 12: Line 12:
  using namespace std;
  using namespace std;
    
    
  long long int dp[12][12][12][12][12][6][6] = {0,};
  long long int dp[12][12][12][12][12][6][6] = {0,};
  long long int arr[5] = {0,};
  long long int arr[5] = {0,};
    
    
  long long int n;
  long long int n;
    
    
  long long int search(long long int now[5], long long int p1, long long int p2){
  long long int search(long long int now[5], long long int p1, long long int p2){
   if(now[0] + now[1] + now[2] + now[3] + now[4] == 0){
   if(now[0] + now[1] + now[2] + now[3] + now[4] == 0){
     return 1;
     return 1;
   }
   }
   if(dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2] != -1){
   if(dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2] != -1){
     return dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2];
     return dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2];
   }
   }
   long long int ans = 0;
   long long int ans = 0;
   for(long long int i = 0; i<n; i++){
   for(long long int i = 0; i<n; i++){
     if(!now[i]){
     if(!now[i]){
       continue;
       continue;
     }
     }
Line 32: Line 32:
       continue;
       continue;
     }
     }
     now[i]--;
     now[i]--;
     ans += search(now, p2,i);
     ans += search(now, p2,i);
     now[i]++;
     now[i]++;
   }
   }
   dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2] = ans;
   dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2] = ans;
   return ans;
   return ans;
  }
  }
Line 43: Line 43:
   cin>>n;
   cin>>n;
   for(long long int i = 0; i<n; i++){
   for(long long int i = 0; i<n; i++){
     scanf("%d", &arr[i]);
     scanf("%d", &arr[i]);
   }
   }
     memset(dp,-1,sizeof(dp));
     memset(dp,-1,sizeof(dp));
Line 52: Line 52:
           continue;
           continue;
         }
         }
         if(!arr[i] || !arr[j]){
         if(!arr[i] || !arr[j]){
           continue;
           continue;
         }
         }
         arr[i]--;
         arr[i]--;
         arr[j]--;
         arr[j]--;
         ans += search(arr,i,j);
         ans += search(arr,i,j);
         arr[i]++;
         arr[i]++;
         arr[j]++;
         arr[j]++;
       }
       }
     }
     }
Line 66: Line 66:
= 아이디어 =
= 아이디어 =
== 15이원준 ==
== 15이원준 ==
* d[[c1]][[c2]][[c3]][[c4]][[c5]][[p1]][[p2]] : ci는 i번째 보석의 갯수, p2는 이전 보석, p1은 지금보석
* dp c1 c2 c3 c4 c5 p1 p2 : ci는 i번째 보석의 갯수, p2는 이전 보석, p1은 지금보석
* search에서 arr[i] 는 이전전 보석 이전에 i번째 보석의 갯수이고 p1은 이전 보석, p2는 지금 보석
* search에서 arr i 는 이전전 보석 이전에 i번째 보석의 갯수이고 p1은 이전 보석, p2는 지금 보석
* i가 p1, p2와 다르고 i번째 보석이 남아있다면 i번째 보석을 하나 빼고 -> i가 p2바로 전 보석이 되고 p2가 현 보석이 되된다.
* i가 p1, p2와 다르고 i번째 보석이 남아있다면 i번째 보석을 하나 빼고 -> i가 p2바로 전 보석이 되고 p2가 현 보석이 되된다.

Latest revision as of 14:46, 26 March 2026

오늘의 문제

참가자

  • 15이원준

코드

15이원준

#include<iostream>
#include<cstring>
using namespace std;
 
long long int dp[12][12][12][12][12][6][6] = {0,};
long long int arr[5] = {0,};
 
long long int n;
 
long long int search(long long int now[5], long long int p1, long long int p2){
  if(now[0] + now[1] + now[2] + now[3] + now[4] == 0){
    return 1;
  }
  if(dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2] != -1){
    return dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2];
  }
  long long int ans = 0;
  for(long long int i = 0; i<n; i++){
    if(!now[i]){
      continue;
    }
    if(p1 == i || p2 == i){
      continue;
    }
    now[i]--;
    ans += search(now, p2,i);
    now[i]++;
  }
  dp[now[0]][now[1]][now[2]][now[3]][now[4]][p1][p2] = ans;
  return ans;
}
 
int main(){
  cin>>n;
  for(long long int i = 0; i<n; i++){
    scanf("%d", &arr[i]);
  }
   memset(dp,-1,sizeof(dp));
   long long int ans = 0;
   for(long long int i = 0; i<n; i++){
     for(long long int j = 0; j<n; j++){
       if(i == j){
         continue;
       }
       if(!arr[i] || !arr[j]){
         continue;
       }
       arr[i]--;
       arr[j]--;
       ans += search(arr,i,j);
       arr[i]++;
       arr[j]++;
     }
   }
   cout << ans<<endl;
}

아이디어

15이원준

  • dp c1 c2 c3 c4 c5 p1 p2 : ci는 i번째 보석의 갯수, p2는 이전 보석, p1은 지금보석
  • search에서 arr i 는 이전전 보석 이전에 i번째 보석의 갯수이고 p1은 이전 보석, p2는 지금 보석
  • i가 p1, p2와 다르고 i번째 보석이 남아있다면 i번째 보석을 하나 빼고 -> i가 p2바로 전 보석이 되고 p2가 현 보석이 되된다.