蓝桥杯第十五讲--复杂dp【例题】(二)

简介: 蓝桥杯第十五讲--复杂dp【例题】

密码脱落

来源: 第七届蓝桥杯省赛C++A/C组,第七届蓝桥杯省赛JAVAC组

题目要求

题目描述:

X 星球的考古学家发现了一批古代留下来的密码。

这些密码是由 A 、 B 、 C 、 D 四种植物的种子串成的序列。

仔细分析发现,这些密码串当初应该是前后对称的(也就是我们说的镜像串)。

由于年代久远,其中许多种子脱落了,因而可能会失去镜像的特征。

你的任务是:

给定一个现在看到的密码串,计算一下从当初的状态,它要至少脱落多少个种子,才可能会变成现在的样子。

输入格式:

共一行,包含一个由大写字母 A B C D  构成的字符串,表示现在看到的密码串。

输出格式:

输出一个整数,表示至少脱落了多少个种子。

数据范围:

输入字符串长度不超过1000

输入样例1:

ABCBA

输出样例1:

0

输入样例2:

ABDCDCBABC

输出样例2:

3

思路分析4.png

代码

#include <cstdio>
#include <string.h>
const int N = 1010;
char s[N];
int f[N][N];
int main()
{
    scanf("%s", s);
    int n = strlen(s);
    for (int len = 1; len <= n; len ++ )
        for (int l = 0; l + len - 1 < n; l ++ )
        {
            int r = l + len - 1;
            if (len == 1) f[l][r] = 1;
            else
            {
                if (s[l] == s[r]) f[l][r] = f[l + 1][r - 1] + 2;
                if (f[l][r - 1] > f[l][r]) f[l][r] = f[l][r - 1];
                if (f[l + 1][r] > f[l][r]) f[l][r] = f[l + 1][r];
            }
        }
    printf("%d\n", n - f[0][n - 1]);
    return 0;
}

生命之树

来源: 第六届蓝桥杯省赛C++B组,第六届蓝桥杯省赛JAVAB组

题目要求

题目描述:

image.png

输入格式:

image.png

输出格式:

输出一行一个数,表示上帝给这棵树的分数。

数据范围:

image.png

输入样例:

5
1 -2 -3 4 5
4 2
3 1
1 2
2 5

输出样例:

8

思路分析

image.png

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010, M = N * 2;
int n;
int w[N];
int h[N], e[M], ne[M], idx;
LL f[N];
void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u, int father)
{
    f[u] = w[u];
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        if (j != father)
        {
            dfs(j, u);
            f[u] += max(0ll, f[j]);
        }
    }
}
int main()
{
    scanf("%d", &n);
    memset(h, -1, sizeof h);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
    for (int i = 0; i < n - 1; i ++ )
    {
        int a, b;
        scanf("%d%d", &a, &b);
        add(a, b), add(b, a);
    }
    dfs(1, -1);
    LL res = f[1];
    for (int i = 2; i <= n; i ++ ) res = max(res, f[i]);
    printf("%lld\n", res);
    return 0;
}



目录
相关文章
|
4月前
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-dp练习3
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-dp练习3
42 0
|
存储 算法
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
蓝桥杯:递归 与 例题:斐波那契数列及优化与应用
69 0
蓝桥杯:递推 例题:数字三角型问题
蓝桥杯:递推 例题:数字三角型问题
49 0
|
移动开发 Shell
蓝桥杯:2020 国赛 例题:天干地支
蓝桥杯:2020 国赛 例题:天干地支
66 0
蓝桥杯:2019 国赛 例题:求值
蓝桥杯:2019 国赛 例题:求值
65 0
蓝桥杯:2021省赛 例题:直线
蓝桥杯:2021省赛 例题:直线
48 0
蓝桥杯:2021省赛 例题:时间显示
蓝桥杯:2021省赛 例题:时间显示
55 0
|
4月前
|
机器学习/深度学习 算法 安全
DSA理解理解蓝桥杯例题signature
DSA理解理解蓝桥杯例题signature
蓝桥杯:最大公约数 2020省赛 例题:既约分数
蓝桥杯:最大公约数 2020省赛 例题:既约分数
59 0
|
11月前
|
人工智能
[蓝桥杯] 数学与简单DP问题
蓝桥杯比赛中常见的还有一类数学问题,这些数学问题有的是有公式计算,有的是考察的思维逻辑。我们具体来看例题。
45 0