250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준#BOJ#12865#평범한배낭
- 백준#boj#16932#모양만들기
- 백준#BOJ#1939#중량제한
- 백준#boj#12755
- 백준#BOJ#8012#한동이는영업사원
- 백준#BOJ#2615#오목
- 백준#BOJ#14501#퇴사#브루트포스
Archives
- Today
- Total
순간을 성실히, 화려함보단 꾸준함을
[ boj : 21941 ] 문자열 제거 본문
https://www.acmicpc.net/problem/21941
해설 : 전형적인 dp 문제입니다.
len 을 문자열 s의 길이라고 정의를 합시다.
dp[i] = 인덱스 i 부터 len-1 까지 제거했을때 가장 최대로 얻을 수 있는 점수
라고 점화식을 세워보죠.
현재 위치한 알파벳으로 시작하는 지울 수 있는 문자열이 존재한다면 그 문자열과 완전히 일치하는지 검사를 하고 일치하면 함수로 들어가고, 아니면 그냥 문자 하나만 지우던지 선택지는 2개입니다.
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
string s;
int m;
vector<string> v[30];
map<string, int> mp;
int dp[1010];
int f(int x);
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
string x;
int y;
cin >> s >> m;
for (int i = 0; i < m; i++) {
cin >> x >> y;
mp[x] = y;
v[x[0] - 'a'].push_back(x);
}
memset(dp, -1, sizeof(dp));
cout<<f(0);
return 0;
}
int f(int x)
{
if (x == s.length())return 0;
if (x > s.length())return -1;
int& ret = dp[x];
if (ret != -1)return ret;
ret = 0;
for (string str : v[s[x] - 'a'])
if(str==s.substr(x,str.length()))
ret = max(ret, f(x + str.length()) + mp[str]);
ret = max(ret, f(x + 1) + 1);
return ret;
}
'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글
[Java] 백준 입력 템플릿 By 류호석 (0) | 2021.08.22 |
---|---|
[ boj : 1918 ] 후위 표기식 (0) | 2021.08.22 |
[ boj : 5214 ] 환승 (0) | 2021.08.16 |
[ boj : 22115 ] 창영이와 커피 (0) | 2021.08.15 |
[ boj : 1101 ] 스티커 정리1 (0) | 2021.08.14 |