给定一串数字,例如 "12335457"。有效的分割是指字符串的一个分割,使得每个段严格大于前一个段。
例如,"12 | 33 | 54 | 57" 是一个有效的分割,而 57 > 54 > 33 > 12。另一个有效的分割可以是 "12 | 335 | 457"。
对于给定的字符串,有多少个有效的分割?该字符串的最大长度可以为 5000。
如果我们使用动态规划,参数为 i 和 j,表示最后一个段来自 i 到 j,则我们可以对剩余部分进行递归处理。
但是这种方法需要 O(n^3) 的时间。我们如何将其从 O(n^3) 减少?谢谢。
例如,"12 | 33 | 54 | 57" 是一个有效的分割,而 57 > 54 > 33 > 12。另一个有效的分割可以是 "12 | 335 | 457"。
对于给定的字符串,有多少个有效的分割?该字符串的最大长度可以为 5000。
如果我们使用动态规划,参数为 i 和 j,表示最后一个段来自 i 到 j,则我们可以对剩余部分进行递归处理。
int solve(int i,int j) {
// memoization need to be added
int last_length = j - i + 1;
int ans = 0;
for(int k = j + last_length ; k < n ; k++) {
if( segment(j+1,k) > segment(i,j) ) { // this is possible in O(1) even if segment lengths are equal
// we should do some pre preocessing on the given string
// which can take O(n^2) time
// if segment(j+1,k) length is more than L , then it is trivial
ans += solve(j+1 , k);
}
}
}
但是这种方法需要 O(n^3) 的时间。我们如何将其从 O(n^3) 减少?谢谢。
O(n^3)
会超时。给定字符串的长度最大为5000
,其中n
是字符串的长度。 - Debashish0
开头吗,例如0047
? - Pham Trung