-
[2216] 문자열과 점수BOJ 2022. 1. 29. 06:57
https://www.acmicpc.net/problem/2216
2216번: 문자열과 점수
첫째 줄에 세 정수 A, B, C (0 < A ≤ 10,000, -10,000 ≤ B, C < 0) 가 주어진다. 그리고 둘째 줄에 X가, 셋째 줄에 Y가 주어진다. 각 문자열의 길이는 3,000자를 넘지 않으며 빈 문자열은 입력으로 주어지지
www.acmicpc.net
<문제>
dp(i, j) : x[0, i), y[0, j)까지 사용했을때의 최적해로 놓고, x[i]==x[j]인 경우와 그 반대로 분기하면 되는데,
기저사례를 만드는 부분에 유의해야 한다. 0이나 -1따위를 return하는것이 아니라
한쪽을 이미 다 써버린 경우에는 (반대쪽 문자+공백)의 조합만 가능하므로 b를 남는 횟수만큼 곱해서 return해준다.
<소스코드>
12345678910111213141516171819202122232425#include <bits/stdc++.h>using namespace std;int a, b, c, ans, dp[3001][3001];string x, y;int f(int i, int j) {if (i < 0) return (j + 1) * b;if (j < 0) return (i + 1) * b;if (dp[i][j] != -1) return dp[i][j];dp[i][j] = max(f(i - 1, j), f(i, j - 1)) + b;if (x[i] == y[j])dp[i][j] = max(f(i - 1, j - 1) + a, dp[i][j]);elsedp[i][j] = max(f(i - 1, j - 1) + c, dp[i][j]);return dp[i][j];}int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> a >> b >> c >> x >> y;int X = x.length(), Y = y.length();memset(dp, -1, sizeof(dp));cout << f(X - 1, Y - 1);return 0;}cs 'BOJ' 카테고리의 다른 글
[12605] 단어순서 뒤집기 (0) 2022.01.29 [10422] 괄호 (0) 2022.01.29 [1505] 불 켜기 (0) 2022.01.26 [16935] 배열 돌리기 3 (0) 2022.01.26 [4375] 1 (0) 2022.01.26