AtCoder Beginner Contest 229 「F dp」

这篇具有很好参考价值的文章主要介绍了AtCoder Beginner Contest 229 「F dp」。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

F - Make Bipartite

题目描述

给出 n + 1 n+1 n+1个点,下标是 0 0 0 n n n,从 1 1 1 n n n都存在一体指向0的带权无向边,边权为ar[i],同时从 i i i i + 1 i+1 i+1也存在一条带权无向边,边权为 b r [ i ] br[i] br[i],当然,n指向的不是n+1,是1,即是一个环

问你形成二分图最小需要删除的边的权值之和是多少

思路

要形成二分图,点i可以和 i − 1 i-1 i1连边,也可以跟 0 0 0连边

假设最后形成的二分图进行染色后

  • 如果 i i i i − 1 i-1 i1 的颜色相同,说明要删除 b r [ i − 1 ] br[i-1] br[i1]

  • 如果 i i i 0 0 0的颜色相同,说明要删除 a r [ i ] ar[i] ar[i]

那我们假设 0 0 0的颜色是0

d p dp dp的状态为:

d p [ i ] [ j ] [ k ] 表示第 i 个点的颜色为 j ,第一个点的颜色为 k dp[i][j][k]表示第i个点的颜色为j,第一个点的颜色为k dp[i][j][k]表示第i个点的颜色为j,第一个点的颜色为k

我们可以通过枚举当前点的颜色和上一个点的颜色来进行状态转移

最后不要忘了计算一下n和1的颜色文章来源地址https://www.toymoban.com/news/detail-519803.html

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

typedef long long ll;
ll mod = 998244353;
#define MAX 1000050
ll n, m, k, x, y, z;
ll ar[MAX], br[MAX];
ll dp[MAX][2][2];

ll min(ll x, ll y){
    return x < y ? x : y;
}

int main(){
    scanf("%lld", &n);
    for(int i = 1; i <= n; ++i)scanf("%lld", &ar[i]);
    for(int i = 1; i <= n; ++i)scanf("%lld", &br[i]);
    memset(dp, 0x3f, sizeof(dp));
    dp[1][0][0] = ar[1];dp[1][1][1] = 0;
    for(int i = 2; i <= n; ++i){
        for(int j = 0; j < 2; ++j){
            for(int pre = 0; pre < 2; ++pre){
                for(int k = 0; k < 2; ++k){
                    dp[i][j][k] = min(dp[i][j][k],dp[i-1][pre][k] +(j == 0 ? ar[i] : 0) +(pre == j ? br[i-1] : 0));
                }
            }
        }
    }
    ll ans = 1e18;
    for(int j = 0; j < 2; ++j){
        for(int k = 0; k < 2; ++k){
            ans = min(ans, dp[n][j][k] + (j==k?br[n]:0));
        }
    }
    printf("%lld\n", ans);
    return 0;
}

到了这里,关于AtCoder Beginner Contest 229 「F dp」的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AtCoder Beginner Contest 320

    给定 (a,b) ,输出 (a^b + b^a) 。 因为数不超过 (10) ,可以直接用 pow 计算然后转成 (int) 。不会有精度损失。 神奇的代码 给定一个字符串 (s) ,求长度最长的回文串。 因为长度只有 (100) ,可以直接枚举子串,然后暴力判断是不是回文串(翻转后是否和自身相同),复杂

    2024年02月08日
    浏览(38)
  • AtCoder Beginner Contest 348

    给定 (n) ,输出 (ooxooxoox...) ,长度为 (n) 。 按题意模拟即可。 神奇的代码 给定 (n) 个点,对每个点,求出与其距离最远的点的下标。 (n) 只有 (100) ,对于每个点,花 (O(n)) 遍历每个点最大化距离,时间复杂度为 (O(n^2)) 。 神奇的代码 (n) 个豌豆,每个豌豆有美味值

    2024年04月08日
    浏览(42)
  • AtCoder Beginner Contest 314

    怎么好多陌生单词 审核怎么这么逆天,半小时还没审完 给定 (pi) 的值以及数 (n) ,要求保留 (n) 位小数输出,不四舍五入。 字符串形式储存然后截取末尾即可。 神奇的代码 (n) 个人玩轮盘赌游戏,简单说就是一个转盘有 (37) 个数字以及一个箭头,箭头会等概率停在某

    2024年02月13日
    浏览(40)
  • AtCoder Beginner Contest 335

    给定一个字符串,将最后一位改成 4 。 模拟即可。 神奇的代码 给定 (n) ,按字典序输出非负整数 (i,j,k) ,使得 (i+j+kleq n) (n) 只有 (21) ,直接 (O(n^3)) 枚举判断即可。 神奇的代码 二维网格,贪吃蛇,移动,进行 (q) 次操作,分两种 指定贪吃蛇下一步移动的方向 指定

    2024年01月19日
    浏览(32)
  • AtCoder Beginner Contest 322

    给定一个字符串,找到最先出现 ABC 的位置。 直接查找判断即可。 神奇的代码 给定字符串 s 和 t ,问 s 是不是 t 的前缀和后缀。 根据前后缀定义判断即可。这里试了下 python 神奇的代码 (n) 天,有 (m) 天会放烟花。 问每一天,距离未来最近的放烟花的天数。 两个双指针一

    2024年02月08日
    浏览(33)
  • AtCoder Beginner Contest 330

    给定 (n) 个学生的分数,以及及格分 (x) ,问多少人及格了。 依次判断即可。 神奇的代码 回答 (n) 个问题,每个问题给定 (a,l,r) ,问函数 (f(x) = |x - a|) 在 ([l,r]) 的最小值。 全定义域下,最小值显然在 (x=a) 取得。绝对值函数图像是 (V) 型。 现在限定在 ([l,r]) ,则

    2024年02月05日
    浏览(116)
  • AtCoder Beginner Contest 318

    咕咕咕,总力战还没打,凹不过卷狗,躺了.jpg 给定 (n, m, p) ,问有多少个 (i) 满足 (0 m+pi leq n) 减去初始的 (m) ,剩下的就是看 (p) 的倍数个数。 神奇的代码 一个二维空间,有 (n) 个矩形覆盖。 问有多大的空间被覆盖了。重复覆盖算一次。 空间大小只有 (100) ,矩形

    2024年02月10日
    浏览(40)
  • AtCoder Beginner Contest 334

    给定两个数 (b,g(b neq g)) ,如果 (b) 大则输出 Bat ,否则输出 Glove 。 比较大小输出即可。 神奇的代码 给定 (a,m,l,r) ,问有多少个整数 (k) 满足 (l leq a + mk leq r) . 对不等式化简一下即为 (frac{l - a}{m} leq k leq frac{r - a}{m}) 的整数个数。 答案就是 (lfloor frac{r - a}{m} r

    2024年02月04日
    浏览(36)
  • AtCoder Beginner Contest 349

    (n) 个人游戏,每局有一人 (+1) 分,有一人 (-1) 分。 给定最后前 (n-1) 个人的分数,问第 (n) 个人的分数。 零和游戏,所有人总分是 (0) ,因此最后一个人的分数就是前 (n-1) 个人的分数和的相反数。 神奇的代码 对于一个字符串,如果对于所有 (i geq 1) ,都有恰好

    2024年04月13日
    浏览(56)
  • AtCoder Beginner Contest 328

    给定 (n) 个数字和一个数 (x) 。 问不大于 (x) 的数的和。 按找要求累计符合条件的数的和即可。 神奇的代码 给定一年的月数和一个月的天数。 问有多少对 ((i,j)) ,表示第 (i) 个月的第 (j) 日, (i,j) 的数位上每个数字都是一样的。 范围只有 (O(100^2)) ,枚举所有的

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包