题目链接:http://codeforces.com/problemset/problem/1207/C

题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道路中可能存在十字路口,如果有十字路口,管道高度必须升至2,其中输入数据为01字符串和n,a,b ,0是正常道路1是遇到十字路口,n是道路长度,a是修每单位管道需要花费的钱,b是每单位高度柱子需要花费的钱,求修完管道的最小花费。题目保证管道开始和结束的时候高度为1。

思路:动态规划题目,用dp[ i ][ j ]表示道路为 i 长度时候当前管道高度为 j -1 的最小花费,dp [ i ] [ 0 ] 表示道路长度到 i 的时候当前管道高度为1的最小花费,dp [ i ] [ 1 ] 为道路长度为 i 时当前管道高度为2的最小花费 。  从最初dp[ 0 ] [ 0 ] = b(初始只有一个高度1的柱子,花费 b),dp[ 0 ] [ 1 ] = 1e16开始进行状态转移(初始柱子高不能为2,设为最大值,这里不能设置为inf,因为数据范围大,longlong可以超过inf)。dp数组有以下几种转移状态:

1. 当遇到十字路口,高度必须为1,所以此时dp[ i ] [ 1 ] = dp[ i -1 ] [ 1 ] + 2 * b + a,dp[ i ] [ 0 ]为无限大

2.遇到非十字路口,我们可以选择升高高度,也可以降下来,或者是延续上一个单位路段的高度,总结下来就是高度任意地可以变为1和2,记录其最小花费。

那么如果将此时高度变为1  ,则 转移方程为 dp[ i ][ 0 ] = min(dp[ i -1 ] [ 0 ] + a+ b , dp [ i -1 ] [ 1 ] + 2 * a + b );

如果高度变为2 则 dp [ i ] [ 1 ] = min ( dp [ i - 1] [ 0 ] +  2 * a + 2 * b  ,dp [ i - 1] [ 1 ] + a + 2 * b) ;

这几种状态不断更新到dp[ n ][ 0 ] 就是最终最小花费

AC代码:

#include<iostream>
#include<vector>
#include<cstring>
#define maxn 200005
#define MAX 1e16
using namespace std;
int t,n;
long long int a,b;
long long int dp[maxn][2];
int main(){
cin>>t;
while(t--){
cin>>n;
cin>>a>>b;
string s;
cin>>s;
dp[0][0] = b;
dp[0][1] = MAX;
for(int i = 0;i<n;i++){
if(s[i] == '0'){
dp[i+1][0] = min(dp[i][0]+a+b,dp[i][1]+2*a+b);
dp[i+1][1] = min(dp[i][0]+2*a+2*b,dp[i][1]+a+2*b);
}
else{
dp[i+1][1] = dp[i][1]+a+2*b;
dp[i+1][0] = MAX;
}
}
cout<<dp[n][0]<<endl;
}
return 0;
}

Codeforces 1207C Gas Pipeline (dp)的更多相关文章

  1. Codeforces Gym101341K:Competitions(DP)

    http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...

  2. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  3. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

  4. Codeforces 1051 D.Bicolorings(DP)

    Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...

  5. Codeforces 704C - Black Widow(dp)

    Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...

  6. Codeforces 682B New Skateboard(DP)

    题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...

  7. Codeforces 543D Road Improvement(DP)

    题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...

  8. Codeforces 543C Remembering Strings(DP)

    题意比较麻烦 见题目链接 Solution: 非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母.于是显然对一个字母进行变换后是不影响到其它字符串的. 20的范围恰好又是常见状 ...

  9. codeforces#983 B. XOR-pyramid (dp)

    参考博客:https://www.01hai.com/note/av137952. 题意:首先定义 (b代表一个数组) 给出一个区间,l,r,求它最大的连续子序列的函数值 分析: 定义dp[x][y] ...

随机推荐

  1. AI机器人最高等级

    AI机器人最高等级 题目描述 在小朱朱的游戏世界里,有n个AI机器人. 他们相互之间可以进行PK,胜方存活且升一级,负方直接淘汰. 高等级AI必定战胜低等级AI,同等级AI的PK结果必定一胜一负,且规 ...

  2. DVA知识集合

    react与dva 原文地址:https://github.com/dvajs/dva-knowledgemap 1.变量声明 const DELAY = 1000 let count = 0 cou ...

  3. selenimu--find_element_by_css_selector()方法汇总

    一.单一属性定位 type selector driver.find_element_by_css_selector('input') id 定位 driver.find_element_by_css ...

  4. Vue.js_devtools_5.1.0.zip【需要的可自行下载】

    点击链接下载: Vue.js_devtools_5.1.0.zip

  5. Visual Studio Code 搭建 C/C++开发环境方法总结

    之前看错资料踩了不少坑,先将可行经验总结如下: 1. 下载 Visual Studio Code 并安装.地址:https://code.visualstudio.com 2. 安装 C/C++插件与 ...

  6. 2019-08-18 纪中NOIP模拟A组

    T1 [JZOJ6309] 完全背包 题目描述

  7. CodeForces 1144B

    原题https://vjudge.net/problem/CodeForces-1144B #include<bits/stdc++.h> using namespace std; vec ...

  8. var s=+newDate();

    var s=+newDate(); 解释如下:=+是不存在的; +new Date()是一个东西; +相当于.valueOf(); 看到回复补充一下.getTime()这个也是得到毫秒数 //4个结果 ...

  9. Spring Boot Post、Get接收Map

    原文地址:https://blog.csdn.net/java0311/article/details/81671754 Post: @RequestBody Map param Get:  @Req ...

  10. Python实现求多个集合之间的并集

    目的:求多个集合之前的并集,例如:现有四个集合C1 = {11, 22, 13, 14}.C2  = {11, 32, 23, 14, 35}.C3 = {11, 22, 38}.C4 = {11,  ...