수정 전> 시간초과
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 50 51 | #include <stdio.h> #include <iostream> #include <string> using namespace std; string str; int dp[2505][2505] = { 0 }; int main() { getline(cin, str); str = "0" + str; int len = str.length() - 1; for (int i = 1; i <= len; i++) { dp[i][i] = 1; } for (int i = 1; i <= len; i++) { for (int j = i+1; j <= len; j++) { if (str[i] == str[j]) { int d; for (d = 0; i + d < j - d; d++) { if (str[i + d] != str[j - d]) { break; } } if (i + d >= j - d) { dp[i][j] = 1; } } } } for (int d = 1; d < len;d++) { for (int i = 1; i + d <= len;i++) { if (dp[i][i + d] != 1) { int minV = 30000; for (int mid = i; mid + 1 <= i + d; mid++) { if (minV > dp[i][mid] + dp[mid + 1][i+d]) { minV = dp[i][mid] + dp[mid + 1][i+d]; } } dp[i][i+d] = minV; } } } printf("%d", dp[1][len]); } | cs |
수정 후> 시간 내 AC
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 | #include <stdio.h> #include <string> #include <iostream> using namespace std; int dp[3000] = { 0 }; string arr; int main() { cin >> arr; arr = "0" + arr; int len = arr.length() - 1; for (int i = 1; i <= len; i++) { int minV = 300000; for (int mid = 0; mid < i; mid++) { int d; for (d = 0; mid + 1 + d < i - d; d++) { if (arr[mid + 1 + d] != arr[i - d]) { break; } } if (mid + 1 + d >= i - d) { int val = dp[mid] + 1; if (minV > val) { minV = val; } } dp[i] = minV; } } printf("%d", dp[len]); } | cs |
'알고리즘 > DP' 카테고리의 다른 글
1563 개근상 (0) | 2019.07.14 |
---|---|
1947 선물 전달 (0) | 2019.07.14 |
10844 쉬운 계단수 (0) | 2019.07.13 |
1254 펠린드롬 만들기 (2가지 풀이) (0) | 2019.07.13 |
1958 LCS3 (0) | 2019.07.13 |