https://www.acmicpc.net/board/view/28163
5시간동안 개삽질하고
답 5분 보고 어이없어서
멘탈터짐
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 | unsigned int max(unsigned int first, unsigned int second) { return first > second ? first : second; } unsigned int dp[1001][1001]; int main() { std::string A, B; std::cin >> A >> B; for (int y = 1; y <= A.size(); ++y) { for (int x = 1; x <= B.size(); ++x) { if (A[y - 1] == B[x - 1]) dp[y][x] += dp[y - 1][x - 1] + 1; else dp[y][x] = max(dp[y][x - 1], dp[y - 1][x]); } } for (int y = 0; y <= A.size(); ++y) { for (int x = 0; x <= B.size(); ++x) { std::cout << dp[y][x]; //dp[A.size()][B.size()]가 정답 } std::cout << '\n'; } return 0; } | cs |
2차원배열을 이용하는 것도 참
생각도 못했다
걍 너무 내가 병신쪼다같고 막.. 그래....
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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | unsigned int getlen(int it, unsigned int n) { //KJFSDFLKDF int tmp = 1; int pos = n; for (unsigned int i = it; i < str1.size(); ++i) { //findPos = prePos; //KJSDFKSDFLKDFJS SKDJKFLSKDJFLKSDJF auto finder = str2.find(str1[i], pos); if (finder == std::string::npos) continue; if (dp2[finder] != 0 && dp2[finder] <= tmp) { ++pos; --i; continue; } unsigned int j = finder; while (j < str2.size()) { if (dp2[j] != 0) break; ++j; //if (tmp > dp2[j] && str2[j] == str1[i]) break; } if (tmp > dp2[j] && dp2[finder] != 0) { ++pos; --i; continue; } if (j == str2.size()) { dp2[finder] = ++tmp; } else { if (str1[i] == str2[j] && tmp < dp2[j]) continue; dp2[finder] = dp2[j]; tmp = dp2[j]; dp2[j] = 0; } //prePos = finder; //int jtmp = 0; //for (unsigned int j = i + 1; j < str1.size(); ++j) //{ // findPos = finder; // finder = str2.find(str1[j], findPos); // if(finder == std::string::npos) continue; // ++jtmp; // if (finder == str2.size() - 1) break; //} //cnt = cnt > tmp + jtmp ? cnt : tmp + jtmp; } std::cout << '\n'; cnt = cnt > tmp ? cnt : tmp; for (int i = 0; i < str2.size(); ++i) std::cout << dp2[i] << ' '; return cnt; } int main() { std::cin >> str1 >> str2; int dcnt = 0; for (unsigned int i = 0; i < str1.size(); ++i) { cnt = 0; auto startPoint = str2.find(str1[i]); if(startPoint == std::string::npos) continue; std::cout << str2[startPoint] << ' '; dp1[dcnt++] = getlen(i + 1, startPoint + 1); } std::sort(dp1, dp1 + str1.size()); std::cout << dp1[str1.size() - 1]; return 0; } | cs |
똥꼬쑈의 흔적
결국 대패배
'알고리즘' 카테고리의 다른 글
백준 11066: 파일 합치기(DP) (0) | 2019.09.06 |
---|---|
백준 1912: 연속합(DP) (0) | 2019.08.27 |
백준 2565: 전깃줄(DP) (0) | 2019.08.23 |
백준 11054: 가장 긴 바이토닉 부분 수열(DP) (0) | 2019.08.23 |
백준 11053: 가장 긴 증가하는 부분 수열(DP) (0) | 2019.08.22 |