首页 > 其他分享 >abc346D 生成仅一处相同01串的最小代价

abc346D 生成仅一处相同01串的最小代价

时间:2024-03-24 11:33:41浏览次数:31  
标签:01 min int rep 最小 abc346D inf 代价 dp

给定由0和1组成的字符串s[n],翻转第i个字符需要花费c[i],现在修改s,使得有且只有一个i满足s[i]==s[i+1],求最小花费。
2<=n<=2e5; 1<=c[i]<=1e9

可以动态规划,记dp[i][j][k]表示前i个字符,以j结尾,存在k处相等的最小花费,对每个位置,枚举改与不改两种情况进行转移。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

const int N = 200005;
const int inf = 1e16;
int n, c[N], dp[N][2][2];
string s;
void solve() {
    cin >> n >> s;
    rep(i,1,n) cin >> c[i];
    if (s[0] == '0') {
        dp[1][0][0] = 0;
        dp[1][0][1] = inf;
        dp[1][1][0] = c[1];
        dp[1][1][1] = inf;
    } else {
        dp[1][0][0] = c[1];
        dp[1][0][1] = inf;
        dp[1][1][0] = 0;
        dp[1][1][1] = inf;
    }
    rep(i,2,n) {
        if (s[i-1] == '0') {
            dp[i][0][0] = dp[i-1][1][0];
            dp[i][0][1] = min(dp[i-1][0][0],dp[i-1][1][1]);
            dp[i][1][0] = c[i] + dp[i-1][0][0];
            dp[i][1][1] = c[i] + min(dp[i-1][1][0],dp[i-1][0][1]);
        } else {
            dp[i][0][0] = c[i] + dp[i-1][1][0];
            dp[i][0][1] = c[i] + min(dp[i-1][0][0],dp[i-1][1][1]);
            dp[i][1][0] = dp[i-1][0][0];
            dp[i][1][1] = min(dp[i-1][0][1],dp[i-1][1][0]);
        }
    }
    cout << min(dp[n][0][1],dp[n][1][1]) << "\n";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}

标签:01,min,int,rep,最小,abc346D,inf,代价,dp
From: https://www.cnblogs.com/chenfy27/p/18092199

相关文章

  • CF1420D & 102012G [线段交集问题]
    CF1420DRescueNibel!首先要发现一个性质:如果一些线段有交集,那么交集一定是条线段,并且一定有其中一条线段的左端点是交集的左端点。所以方案可以转化为求其中一条线段的左端点是交集的左端点的方案数。这启发我们枚举每个点作为交集的左端点,计算至少有一条线段的左端点是这个......
  • Python-VBA编程500例-017(入门级)
    数组剔除元素后的乘积(TheProductResultingFromAnArrayWithElementsExcluded)在多个领域具有实际应用价值。常见的应用场景有:1、金融数据分析:在金融领域,数组通常用来存储股票价格、交易量或其他相关金融指标。当分析人员需要剔除某个异常数据点或某个时间段的数据以进......
  • 前端学习-vue视频学习012-路由
    尚硅谷视频教程路由简介路由就是一组key-value的对应关系多个路由,需要经过路由器的管理怎样才能使用路由器安装路由器npmivue-router在src内新增文件夹router在router文件夹新增文件index.ts,在其中创建路由器并暴露出去//创建一个路由并暴露出去//引入createR......
  • 01.绝对路径和相对路径(Linux基本概念)
    基础认知:        电脑的目录结构是一颗多叉树。不管是Linux还是windows,目录结构都是一样的。所以我们在查找某个目录或者文件的时候,本质就是在多叉树结点的查找。多叉树示例图如下:                ​​​​​​​        ​​​​​​​  ......
  • P3344 [ZJOI2015] 幻想乡 Wi-Fi 搭建计划
    非常精妙的一个做法。简化题意:定义合法区域为\(y\in[0,R]\)的区域,给定一些在合法区域内的标记点,与一些圆心在合法区域外的,半径为\(R\)的圆,选择第\(i\)个圆会产生\(c_i\)的代价。第一问是最多能覆盖几个标记点;第二问是在保证覆盖标记点最多的情况下,代价的最小值。首先......
  • 中考英语首字母快速突破014-2021上海徐汇英语二模-Future Changes: Predictions and P
    PDF格式公众号回复关键字:ZKSZM014原文​Readthecommentsaboutchangesinthefuture.Howmuchdoyouagreewiththem?​Thedays,somepeopleworkathomeoneortwodaysaweekinsteadofgoingtoanofficeeveryday.Ithinkinthefuture......
  • P3592 [POI2015] MYJ
    P3592[POI2015]MYJ要求总和最大,有两张思路:贪心和dp。稍微想一下,发现贪心思考量太大,考虑dp观察n的数据范围,以及转移方式,可以想到区间dp发现转移跟区间最小值有关,设\(f_{l,r,k}\)为区间\([l,r]\)中最小值不小于\(x\)的答案。转移枚举最小值的位置\(p\),\(f_{l,r,k}......
  • P5021 [NOIP2018 提高组] 赛道修建
    P5021[NOIP2018提高组]赛道修建在树上选\(m\)条不重合的路径(可以有交点),使得这些路径长度的最小值最大。看到最小值最大,很自然想到二分模型:枚举最小值\(L\),看大于等于\(L\)的路径能不能有\(m\)条。如何在树上选出\(m\)条路径最优成为我们要思考的问题,考虑树上贪心。......
  • P10173 「OICon-02」maxiMINImax
    P10173「OICon-02」maxiMINImax首先观察所求的式子,我们可以很容易发现\(\min_{[l_2,l_2]}>\max(\max_{[l_1,r_1]},\max_{[l_3,r_3]})\),否则贡献一定为\(0\)。此时如果要考虑枚举其中一个区间,我们肯定选择中间的\([l_2,r_2]\),但是这样复杂度仍然至少是\(O(n^2)\)。我们思考......
  • 洛谷P3498 [POI2010] KOR-Beads 题解
    P3498[POI2010]KOR-Beads对于数列${A_i}$,求$k$使数列被分为$\lfloor\frac{n}{k}\rfloor$个部分后不同子数列种类最多(子串翻转前后为一类子串)很容易想到:枚举$k\\in\[1,n]$,记录每个$k$下不同种类数,然后取最优即可,那么问题来了:如何计算种类数?暴戾算法:一种纯......