Codeforces 1207C Gas Pipeline (dp)
题目链接: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)的更多相关文章
- Codeforces Gym101341K:Competitions(DP)
http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...
- codeforces 711C Coloring Trees(DP)
题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...
- codeforces#1154F. Shovels Shop (dp)
题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...
- Codeforces 1051 D.Bicolorings(DP)
Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...
- Codeforces 704C - Black Widow(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...
- Codeforces 682B New Skateboard(DP)
题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...
- Codeforces 543D Road Improvement(DP)
题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...
- Codeforces 543C Remembering Strings(DP)
题意比较麻烦 见题目链接 Solution: 非常值得注意的一点是题目给出的范围只有20,而众所周知字母表里有26个字母.于是显然对一个字母进行变换后是不影响到其它字符串的. 20的范围恰好又是常见状 ...
- codeforces#983 B. XOR-pyramid (dp)
参考博客:https://www.01hai.com/note/av137952. 题意:首先定义 (b代表一个数组) 给出一个区间,l,r,求它最大的连续子序列的函数值 分析: 定义dp[x][y] ...
随机推荐
- 关于eclipse 项目导入不了 maven依赖的解决办法
1.首先确定你的项目是maven 项目 ,如果不是:项目右键Configure -->Convert to maven project. 2.在SVN导出的Maven项目,或以前不是用Maven ...
- R语言函数化编程笔记2
R语言函数化编程笔记2 我学过很多的编程语言,可以我写的代码很啰嗦,一定是我太懒了.或许是基础不牢地动山摇 1.为什么要学函数 函数可以简化编程语言,减少重复代码或者说面向对象的作用 2.函数 2.1 ...
- 0002 PyCharm设置
1 设置编码格式 File/Settings/Editor/File Encodings 2 设置字体 File/Settings/Editor/Font 3 鼠标滚轮改变编辑器字体大小 File/S ...
- 洛谷P 1427 小鱼的数字游戏
题目描述 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个,数字不超过2^32-1),记住了然后反着念出来(表示结束的数字0就不要念出来了).这对小鱼的 ...
- CodeForces 1144B
原题https://vjudge.net/problem/CodeForces-1144B #include<bits/stdc++.h> using namespace std; vec ...
- eclipse 项目的创建 编写 'Hello World'
写项目之前确保 eclipse 安装完成 以及JDK 环境配置 成功 开始: 打开eclipse 右键file ->new->java project 如图: 然后输入项目名 点击Fin ...
- vm virtualbox 里的ubuntu挂载windows的文件夹
1.先在virtualbox里设置好共享文件夹 如右图所示: 共享文件夹-添加共享文件夹 里面: 选择好 共享文件夹路径,起好 共享文件夹名称,下面都不用选. 假设共享文件名是ShareD, 2. 然 ...
- 155.XSS攻击原理
XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...
- 重载(Overload)和重写(Override)的区别是什么?
首先java程序的运行分为编译和运行两部分. 所以重载和重写在这一点就有很明显的区别,因为重写方法的方法名和参数个数类型都一样,所以在java虚拟机的编译阶段是识别不出重写的方法的不同,在运行期间才可 ...
- redis的linux安装
1.下载安装包 [root@localhost opt]# yum install wget [root@localhost opt]# wget http://download.redis.io/r ...