어흥
[SWEA 7206] 숫자 게임 (C++) 본문
728x90
반응형
1. 주의할 점
- Check[idx] 배열을 만들어서 값을 기록해놓는다(idx의 경우 최대 몇 번의 Turn이 가능한지)
2. 구현
- 초기에 Check[] 배열을 전부 -1로 초기화하고 한 자리 숫자는 0으로 초기화 한다
- DFS(Sum,Tot,Ss,V)를 통해 해당 Ss를 몇 부분으로 쪼갤 수 있는지 벡터 V에 담는다
- Sum==Tot인 경우, V의 Size가 1일때는 return(1 덩이이므로) Cal(Ss,V) 함수를 실행하여 Check[Stoi(ss)]를 최대로 초기화해준다
- Cal(Ss,V) 함수는 V에 담긴 부분으로 Ss를 나누고, 각 원소들을 곱한 값을 Tmp에 저장하고 Check[Tmp]가 -1이 아니라면 Check[Tmp]를 반환하고 -1인 경우, DFS(0,Tmp의 문자열 크기, Tmp의 문자열, Vv)를 수행한다. 새로운 Vv 벡터를 만들어서 기존 V 벡터와 겹치지 않도록 한다
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
int result;
int check[100000];
int cal(string s, vector<int> v);
void dfs(int sum, int tot, string ss, vector<int> v) {
if (sum == tot) {
if (v.size() == 1) return;
check[stoi(ss)] = max(check[stoi(ss)], cal(ss, v));
return;
}
for (int i = 1; i <= tot - sum; i++) {
v.push_back(i);
dfs(sum + i, tot, ss, v);
v.pop_back();
}
}
int cal(string s, vector<int> v) {
int tmp = 1, cnt = 0;
for (int i = 0; i < v.size(); i++) {
int len = v[i];
string ss = s.substr(cnt, len);
int val = stoi(ss);
tmp *= val;
cnt += len;
}
if (check[tmp] == -1) {
string st = to_string(tmp);
vector<int> vv;
dfs(0, st.size(), st, vv);
}
return check[tmp] + 1;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int test;
cin >> test;
for (int i = 0; i < 100000; i++)
check[i] = -1;
for (int i = 0; i < 10; i++)
check[i] = 0;
for (int t = 1; t <= test; t++) {
result = 0;
string str;
cin >> str;
vector<int> v;
dfs(0, str.size(), str, v);
cout << "#" << t << " " << check[stoi(str)] << '\n';
}
system("pause");
return 0;
}
728x90
반응형
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA 1953] 탈주범 검거 (JAVA) (0) | 2020.05.28 |
---|---|
[SWEA 3234] 준환이의 양팔저울 (JAVA) (1) | 2020.05.22 |
[SWEA 4193] 수영대회 결승전 (C++) (0) | 2020.05.22 |
[SWEA 4727] 견우와 직녀 (C++) (0) | 2020.05.15 |
[SWEA 2112] 보호 필름 (C++) (0) | 2020.05.08 |
Comments