BOJ 25341 - 인공 신경망
시간 초과를 피하기 위해서 복잡한 입력을 잘 처리하여 각 $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;
}
}
Comments