题解 | #密码截取#
密码截取
https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1
#include <iostream> #include <vector> #include <cmath> using namespace std; int main() { string s; int res = 1; cin >> s; int n = s.size(); // 代表以下标为n结尾的码串的最长有效密码传长度 vector<vector<int>> dp(n, vector<int>(2, 1)); // [i][0]代表有效密码串不完全相同的情况,[i][1]代表有效密码串完全相同的情况 for (int i = 1; i < n; i++) { if (s[i] == s[i - 1]) { dp[i][1] = dp[i - 1][1] + 1; res = max(res, dp[i][1]); } else { int tmp1 = 1, tmp2 = 1; if (i - 1 - dp[i - 1][1] >= 0 && s[i] == s[i - 1 - dp[i - 1][1]]) { tmp1 = dp[i - 1][1] + 2; } if (i - 1 - dp[i - 1][0] >= 0 && s[i] == s[i - 1 - dp[i - 1][0]]) { tmp2 = dp[i - 1][0] + 2; } dp[i][0] = max(tmp1,tmp2); res = max(res, dp[i][0]); } } cout << res << endl; return 0; } // 64 位输出请用 printf("%lld")
动态规划的核心是定义过程量 以及 考虑过程量之间的关系。
本题对于对称 分成了全部相同和 非全部相同两种情况进行考虑, 并考虑了他们之间的关系。