火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

二选一

作者: 作者的头像   赵辰煜 , 时间:2024-03-16 15:42:45 , 所有人可见, 阅读  27

A.

#include <bits/stdc++.h>
using namespace std;
int minInsertions(string s) {
    int n = s.size();
    vector<vector<int>> dp(n, vector<int>(n, 0));
    for (int len = 2; len <= n; len ++ )
        for (int i = 0; i <= n - len; i ++ ) {
            int j = i + len - 1;
            if (s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1];
            else dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]) + 1;
        }
    return dp[0][n - 1];
}
int main() {
    string s;
    cin >> s;
    cout << minInsertions(s);
    return 0;
}

B.

#include <bits/stdc++.h>
using namespace std;
int Indfggfsa = 0x3f3f3f3f;
deque<int> vec;
int n;
bool flag = 0;
void dfs(int sumA, int sumB, int k) {
    if (k == n) {
        if (sumA >= sumB) flag = 1;
        return;
    }
    if (k % 2 == 0) {
        int cfront = vec[0], cback = vec[vec.size() - 1];
        vec.pop_front();
        dfs(sumA + cfront, sumB, k + 1);
        vec.push_front(cfront);
        vec.pop_back();
        dfs(sumA + cback, sumB, k + 1);
        vec.push_back(cback);
    } else {
        int cfront = vec[0], cback = vec[vec.size() - 1];
        if (cfront > cback) {vec.pop_front(); dfs(sumA, sumB + cfront, k + 1); vec.push_front(cfront);}
        else {vec.pop_back(); dfs(sumA, sumB + cback, k + 1); vec.push_back(cback);}
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr);
    cin >> n;
    for (int i = 0; i < n; i ++ ) {
        int x;
        cin >> x;
        vec.push_back(x);
    }
    dfs(0, 0, 0);
    cout << (flag ? "true" : "false");
    return 0;
}

C.

#include <bits/stdc++.h>
using namespace std;
int minScoreTriangulation(vector<int>& values) {
    int n = values.size();
    vector<vector<int>> dp(n, vector<int>(n, 0));
    for (int length = 2; length < n; length ++ )
        for (int i = 0; i + length < n; i ++ ) {
            int j = i + length;
            dp[i][j] = INT_MAX;
            for (int k = i + 1; k < j; k ++ ) dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + values[i] * values[k] * values[j]);
        }
    return dp[0][n - 1];
}
int main() {
    int n;
    cin >> n;
    vector<int> values(n);
    for (int i = 0; i < n; i ++ ) cin >> values[i];
    cout << minScoreTriangulation(values);
    return 0;
}

D.

#include <bits/stdc++.h>
using namespace std;
int minCost(int n, vector<int>& cuts) {
    cuts.push_back(0);
    cuts.push_back(n);
    sort(cuts.begin(), cuts.end());
    int m = cuts.size();
    vector<vector<int>> dp(m, vector<int>(m, 0));
    for (int len = 2; len < m; len ++ )
        for (int i = 0; i + len < m; i ++ ) {
            int j = i + len;
            dp[i][j] = INT_MAX;
            for (int k = i + 1; k < j; k ++ ) dp[i][j] = min(dp[i][j], cuts[j] - cuts[i] + dp[i][k] + dp[k][j]);
        }
    return dp[0][m - 1];
}
int main() {
    int n, m;
    cin >> n >> m;
    vector<int> cuts(m);
    for (int i = 0; i < m; i ++ ) cin >> cuts[i];
    cout << minCost(n, cuts);
    return 0;
}

E.

#include <bits/stdc++.h>
using namespace std;
int maxCoins(vector<int>& nums) {
    int n = nums.size();
    vector<vector<int>> dp(n + 2, vector<int>(n + 2, 0));
    vector<int> balloons(n + 2, 1);
    for (int i = 1; i <= n; i ++ ) balloons[i] = nums[i - 1];
    for (int len = 1; len <= n; len ++ )
        for (int i = 1; i <= n - len + 1; i ++ ) {
            int j = i + len - 1;
            for (int k = i; k <= j; k ++ ) dp[i][j] = max(dp[i][j], balloons[i - 1] * balloons[k] * balloons[j + 1] + dp[i][k - 1] + dp[k + 1][j]);
        }
    return dp[1][n];
}
int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i ++ ) cin >> nums[i];
    cout << maxCoins(nums);
    return 0;
}

I.

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> adj;
vector<int> color;
vector<unordered_set<int>> subtree_colors;
vector<int> result;
void dfs(int u, int parent) {
    subtree_colors[u].insert(color[u]);
    for (int v : adj[u]) {
        if (v == parent) continue;
        dfs(v, u);
        if (subtree_colors[u].size() < subtree_colors[v].size()) swap(subtree_colors[u], subtree_colors[v]);
        for (int c : subtree_colors[v]) subtree_colors[u].insert(c);
    }
    result[u] = subtree_colors[u].size();
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    color.resize(n + 1);
    for (int i = 1; i <= n; i ++ ) cin >> color[i];
    adj.resize(n + 1);
    for (int i = 0; i < n - 1; i ++ ) {
        int a, b;
        cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    subtree_colors.resize(n + 1);
    result.resize(n + 1);
    dfs(1, -1);
    for (int i = 1; i <= n; i ++ ) cout << result[i] << " ";
    return 0;
}

J.

#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
string a, b;
int f[N][N], n, m;
int main() {
    ios_base::sync_with_stdio(0);
    cin >> a >> b;
    n = a.size();
    m = b.size();
    for(int i = 0; i <= m; i ++ ) f[0][i] = i; 
    for(int i = 0; i <= n; i ++ ) f[i][0] = i; 
    for(int i = 1; i <= n; i ++ )
        for(int j = 1; j <= m; j ++ ) {
            f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1);
            if(a[i - 1] == b[j - 1]) f[i][j] = min(f[i][j], f[i - 1][j - 1]);
            else f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);
        }
    cout << f[n][m];
    return 0;
}

L.

 #include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, x, h[N], s[N], dp[N], ans;
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> x;
    for (int i = 1; i <= n; i ++ ) cin >> h[i];
    for (int i = 1; i <= n; i ++ ) cin >> s[i];
    for (int i = 1; i <= n; i ++ )
        for (int j = x; j >= h[i]; j -- )
            dp[j] = max(dp[j], dp[j - h[i]] + s[i]);
    for (int j = x; j >= 0; j -- ) ans = max(ans, dp[j]);
    cout << ans;
    return 0;
}

M.

#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
int main() {
    int n;
    cin >> n;
    vector<vector<char>> a(n, vector<char>(n));
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n; j ++ ) cin >> a[i][j];
    vector<vector<int>> dp(n, vector<int>(n, 0));
    dp[0][0] = (a[0][0] == '.') ? 1 : 0;
    for (int i = 1; i < n; i ++ ) {
        if (a[i][0] == '.') dp[i][0] = dp[i - 1][0];
        else dp[i][0] = 0;
    }
    for (int j = 1; j < n; j ++ ) {
        if (a[0][j] == '.') dp[0][j] = dp[0][j - 1];
        else dp[0][j] = 0;
    }
    for (int i = 1; i < n; i ++ ) {
        for (int j = 1; j < n; j ++ ) {
            if (a[i][j] == '.') dp[i][j] = (dp[i - 1][j] + dp[i][j - 1]) % MOD;
            else dp[i][j] = 0;
        }
    }
    cout << dp[n - 1][n - 1];
    return 0;
}

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码