zoukankan      html  css  js  c++  java
  • C. Gas Pipeline DP

    C. Gas Pipeline
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are responsible for installing a gas pipeline along a road. Let's consider the road (for simplicity) as a segment [0,n][0,n] on OXOX axis. The road can have several crossroads, but for simplicity, we'll denote each crossroad as an interval (x,x+1)(x,x+1) with integer xx. So we can represent the road as a binary string consisting of nn characters, where character 0 means that current interval doesn't contain a crossroad, and 1 means that there is a crossroad.

    Usually, we can install the pipeline along the road on height of 11 unit with supporting pillars in each integer point (so, if we are responsible for [0,n][0,n] road, we must install n+1n+1 pillars). But on crossroads we should lift the pipeline up to the height 22, so the pipeline won't obstruct the way for cars.

    We can do so inserting several zig-zag-like lines. Each zig-zag can be represented as a segment [x,x+1][x,x+1] with integer xx consisting of three parts: 0.50.5 units of horizontal pipe + 11 unit of vertical pipe + 0.50.5 of horizontal. Note that if pipeline is currently on height 22, the pillars that support it should also have length equal to 22 units.

    Each unit of gas pipeline costs us aa bourles, and each unit of pillar — bb bourles. So, it's not always optimal to make the whole pipeline on the height 22. Find the shape of the pipeline with minimum possible cost and calculate that cost.

    Note that you must start and finish the pipeline on height 11 and, also, it's guaranteed that the first and last characters of the input string are equal to 0.

    Input

    The fist line contains one integer TT (1T1001≤T≤100) — the number of queries. Next 2T2⋅T lines contain independent queries — one query per two lines.

    The first line contains three integers nn, aa, bb (2n21052≤n≤2⋅105, 1a1081≤a≤108, 1b1081≤b≤108) — the length of the road, the cost of one unit of the pipeline and the cost of one unit of the pillar, respectively.

    The second line contains binary string ss (|s|=n|s|=n, si{0,1}si∈{0,1}, s1=sn=0s1=sn=0) — the description of the road.

    It's guaranteed that the total length of all strings ss doesn't exceed 21052⋅105.

    Output

    Print TT integers — one per query. For each query print the minimum possible cost of the constructed pipeline.

    Example
    input
    Copy
    4
    8 2 5
    00110010
    8 1 1
    00110010
    9 100000000 100000000
    010101010
    2 5 1
    00
    
    output
    Copy
    94
    25
    2900000000
    13
    
    Note

    The optimal pipeline for the first query is shown at the picture above.

    The optimal pipeline for the second query is pictured below:

    The optimal (and the only possible) pipeline for the third query is shown below:

    The optimal pipeline for the fourth query is shown below:

    题意:管道工人需要在一段凹凸不平的道路上铺管子,给一串长度为n的01序列描述地形,1表示一定要把水管用钢管架高在离地面2个单位,0表示水管离地面高度可以为1,也可以为2,

    在转折的地方需要额外花费1单位的水管,给定水管和钢管的价格a,b;问最少需要花费多少钱

    #include<iostream>
    #include<string.h>
    #include<string>
    #include<algorithm>
    #include<math.h>
    #include<string>
    #include<string.h>
    #include<vector>
    #include<utility>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #define mx 0x3f3f3f3f3f3f3f
    #define ll long long
    #define MAXN 100
    using namespace std;
    ll dp[200005][2];
    char s[200005];
    ll n,a,b,t;
    int main()
    {
        cin>>t;
        while(t--)
        {
            cin>>n>>a>>b;
            scanf("%s",s+1);
            for(int i=0;i<=n;i++)//初始化dp
            {
                dp[i][0]=mx;
                dp[i][1]=mx;
            }    
            dp[0][0]=b;
            dp[0][1]=mx;
            for(int i=1;i<=n;i++)
            {
                if(s[i]=='1')//高柱子的右边一定是长度为2的管子
                    dp[i][1]=min(dp[i][1],dp[i-1][1]+a+b*2);
                else//低柱子的右边可能是长度为1的,也可能是长度为2的管子,两者取更小的花费
                {
                    dp[i][0]=min(dp[i][0],min(dp[i-1][0]+a+b,dp[i-1][1]+2*a+b));
                    dp[i][1]=min(dp[i][1],min(dp[i-1][0]+2*a+2*b,dp[i-1][1]+a+b*2));
                }
            }
            cout<<dp[n][0]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    YARN 多租户资源池配置
    HDFS NameNode HA 部署文档
    MySQL 触发器示例
    Apache ZooKeeper 单机、集群部署文档
    Apache Flume 安装文档、日志收集
    IBM X3650 M4 主板故障
    Apache Hive 安装文档
    Apache Hadoop 集群安装文档
    Cloudera Manger CDH 安装文档
    VMware 克隆网卡无法启动
  • 原文地址:https://www.cnblogs.com/-citywall123/p/11474937.html
Copyright © 2011-2022 走看看