class RepeatStringEasy {
public:
vector<vector<vector<int>>> cache;
int _maximal(int l, int m, int r);
int maximalLength(string);
string s;
};
int RepeatStringEasy::_maximal(int l, int m, int r) {
if (l >= m)
return 0;
if (l == s.size() || r == s.size())
return 0;
if (cache[l][m][r] >= 0)
return cache[l][m][r];
int& result = cache[l][m][r];
if (s[l] == s[r]) {
result = _maximal(l+1, m, r+1) + 2;
return result;
}
result = max(_maximal(l+1, m, r), _maximal(l, m, r+1));
return result;
}
int RepeatStringEasy::maximalLength(string s) {
cache = vector<vector<vector<int>>>(50, vector<vector<int>>(50, vector<int>(50, -1)));
int ret = 0;
for (int i = 0; i < s.size(); ++i)
ret = max(ret, _maximal(0, i, i));
return ret;
}
저는 저 DP 테이블을 채우는 연산을 dominant term 이라 봐서 O(N3) 인 것 같은데 (실제 구현을 iterative 하게 바꾸면 3중 for loop 로 구현할 수도 있고요.) 보이기에는 n3 테이블을 채우는 함수를 바깥 for loop 에서 한 번 더 부르고 있으니 O(N4) 같아 보이기도 합니다. 어떤게 맞을까요?
kwangswei
아래 코드의 시간 복잡도는 O(N3) 인가요? O(N4) 인가요?
저는 저 DP 테이블을 채우는 연산을 dominant term 이라 봐서 O(N3) 인 것 같은데 (실제 구현을 iterative 하게 바꾸면 3중 for loop 로 구현할 수도 있고요.) 보이기에는 n3 테이블을 채우는 함수를 바깥 for loop 에서 한 번 더 부르고 있으니 O(N4) 같아 보이기도 합니다. 어떤게 맞을까요?
9년 전