枚举分界点,暴力直接过。
100%代码
//1. #include <iostream> #include <vector> using namespace std; int main() { string s; while (cin >> s) { //while (1) { int n = s.size(); vector<int> l(n + 1); vector<int> r(n + 1); for (int i = 0; i < n; i++) { if (s[i] == '0') l[i + 1] = l[i] + 1; else l[i + 1] = l[i]; } for (int i = n - 1; i >= 0; i--) { if (s[i] == '1') r[n - i] = r[n - i - 1] + 1; else r[n - i] = r[n - i - 1]; } int ans = 0; for (int i = 0; i <= n; i++) { ans = max(ans, l[i] + r[n - i]); } cout << ans + n << endl; } }
简单dp,记录8种状态
f [ i ] [ j ] 代表前 j 个字符,最后的选择是 i 的方案数。
sum [ i ] 代表前 i 个字符的答案。
98%代码:不知道为什么有2%不过
//2. #include <iostream> #include <vector> using namespace std; int f[8][105]; int sum[105]; int main() { string s; while (cin >> s) { int n = s.size(); sum[0] = 1; for (int i = 1; i <= n; i++) { if (s[i - 1] == '1') { f[1][i] += sum[i - 1]; f[3][i] += f[1][i - 1]; f[5][i] += f[2][i - 1]; f[7][i] += f[3][i - 1]; } else { f[0][i] += sum[i - 1]; f[2][i] += f[1][i - 1]; f[4][i] += f[2][i - 1]; f[6][i] += f[3][i - 1]; } for (int j = 0; j < 8; j++) { sum[i] += f[j][i]; } } if (n == 0) cout << 0 << endl; else cout << sum[n] << endl; } }
也算是dp吧,
f [ i ] 代表跳到第i个台阶后的最大值。
根据f [ i – 1 ] 和f [ i – 2 ]更新
f 数组更新之后,遍历,找到最大值。
100%代码
//3. #include <iostream> #include <vector> using namespace std; int main() { int M; cin >> M; vector<int>s; while (1) { int t; cin >> t; s.emplace_back(t); char ch = getchar(); if (ch == '\n') break; } int n = s.size(); vector<int>f(n + 1); f[0] = M; if (M < 2) { cout << M << endl; return 0; } f[1] = max(f[1], f[0] - 2 + s[0]); for (int i = 2; i <= n; i++) { if (f[i - 1] > 1) { f[i] = max(f[i], f[i - 1] - 2 + s[i - 1]); } if (f[i - 2] > 2) { f[i] = max(f[i], f[i - 2] - 3 + s[i - 1]); } } int maxvis = 0; for (int i = 1; i <= n; i++) { maxvis = max(maxvis, f[i]); } cout << maxvis << endl; }
迪杰斯特拉最短路
太菜,忘了怎么写。时间也不太够,手动狗
全部评论
(0) 回帖