1. 두 문자가 같은 경우에는 A(> 0)점을 받게 된다. 단, 두 문자가 모두 공백인 경우는 허용되지 않는다. 2. 두 문자 중 적어도 하나가 공백인 경우에는 B(< 0)점을 받게 된다. 3. 두 문자가 모두 공백이 아니고 서로 다른 경우에는 C(< 0)점을 받게 된다.
여기서 문자 사이에 공백을 원하는대로 넣을수 있기 때문에
적절하게 공백을 넣어서 점수를 최대로 받아야 하는 문제입니다.
dp[idx1][idx2]: 문자열을 idx1, idx2까지 사용했을 때 얻을 수 있는 최대 점수
s1, s2 중 하나의 문자에 공백을 추가하거나 두 문자를 비교하여 a, b, c 중 적절한 값을 더합니다.
위 3가지 중 max를 구하도록 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#define MAX 3010
usingnamespacestd;
string s1, s2;
int dp[MAX][MAX];
int a, b, c;
int len1, len2;
int solve(int idx1, int idx2) {
if (idx1 == len1) return (len2 - idx2) * b;
if (idx2 == len2) return (len1 - idx1) * b;
int& ret = dp[idx1][idx2];
if (ret !=-1) return ret;
ret = b + max(solve(idx1 +1, idx2), solve(idx1, idx2 +1));