首页 > 2020/9/13 10:00 网易笔试
头像
Ember_Sky
编辑于 2020-09-13 12:30
+ 关注

2020/9/13 10:00 网易笔试

枚举分界点,暴力直接过。
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) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐