BOJ 25341 - 인공 신경망

image.png

시간 초과를 피하기 위해서 복잡한 입력을 잘 처리하여 각 $A_i$에 값이 들어올 때 얼마나 결과값에 곱해져서 기여가 되는지 미리 전처리해두어야 하는 문제이다.

은닉층이 가진 $B_i$ 는 출력층의 $W_i$ 와 각각 곱해져서 더해지고,

출력층이 가진 $B_M$ 은 그냥 그대로 더해지고,

은닉층이 가진 $W_i$ 들은 출력층의 $W_i$ 와 한번 곱해진다음 그 곱해진 값이 각 $A_i$ 마다 값이 들어올 때 곱해져서 결과값에 더해지는 값이다.

void solve() {
   int N, M, Q;
   cin >> N >> M >> Q;
   vi B(M + 1);
   vvi W(M + 1), P(M + 1);
   for (int i = 0; i < M; i++) {
      int c;
      cin >> c;
      for (int j = 0; j < c; j++) {
         int k;
         cin >> k;
         P[i].pb(k - 1);
      }
      for (int j = 0; j < c; j++) {
         int k;
         cin >> k;
         W[i].pb(k);
      }
      cin >> B[i];
   }
   for (int i = 0; i < M; i++) {
      int k;
      cin >> k;
      W[M].pb(k);
   }
   cin >> B[M];
   ll ans = B[M];
   vi mul(N);
   for (int i = 0; i < M; i++) {
      ans += W[M][i] * B[i];
   }
   for (int i = 0; i < M; i++) {
      for (int j = 0; j < sz(W[i]); j++) {
         mul[P[i][j]] += W[i][j] * W[M][i];
      }
   }
   while (Q--) {
      vi A(N);
      fv(A);
      ll tmp = ans;
      for (int i = 0; i < N; i++) {
         tmp += A[i] * mul[i];
      }
      cout << tmp << endl;
   }
}

Tags:

Categories:

Updated:

Comments