题目链接: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. 2级搭建类201-Oracle 12cR2 单实例 ASM(OEL7.7)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列除特定项目目前不对外发布,仅作为博客记录,其他公开.如学员在 ...

  2. 摇一摇—微信7.0.8版本audio无法自动播放问题

    近日有一个项目出现audio无法自动播放,查看原因才发现是微信版本更新为7.0.8版本,需要有交互行为,第一次播放需要用户手动点击一下,无法使用DOM中的play()进行直接播放操作,那怎么办呢? 通 ...

  3. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  4. smarty文章字符截取

    {%$data.dealer_info.address|replace:' ':''|cutstr:58%} cutstr:58

  5. The Number of Inversions(逆序数)

    For a given sequence A={a0,a1,...an−1}A={a0,a1,...an−1}, the number of pairs (i,j)(i,j) where ai> ...

  6. 洛谷P3367 【模板】并查集 模板 找baba

    链接https://www.luogu.org/problem/P3367 #include<bits/stdc++.h> using namespace std; ; int fa[ra ...

  7. LaTeX技巧006:使用pdfLaTeX时,添加PDF文件属性的方法

    PDF文件中含有标题.主题.作者.关键字等属性.这些属性,在Acrobat Reader或者Foxit Reader中可以通过”文件”菜单下的”属性”查看,在Acrobat Read中还可以使用Ctr ...

  8. Linux下搭建PHP环境的参考文章小记

    之前也在Linux上安装过两次,但是当我再次需要安装时,还是很多不懂的地方,于是记下此篇,以防下次再费经心思找到不合适的文章,瞎折腾. 通过参考这几篇文章,成功的安装好了自己的PHP(LNMP)环境. ...

  9. [转]shallow heap & retained heap

    所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size.  ...

  10. Python标准库Random

    基本方法 获取一个[0,1)的随机浮点数: import random print(random.random()) #输出 0.6701488343121276 获取指定区间的随机浮点数: impo ...