C.Gas Pipeline

题目大意:沿着一个x轴方向的公路修管子,由一串01的字符串表示这个公路的路段信息,有1的地方表示有十字路口,所以要把管子抬高才能使车辆迅速通过
然后给出一单位柱子造价和一单位管子造价,求最少开销(题目给出,首尾都是一根柱子)
思路:我们可以看出,在1的单元格中,由于它要抬高,它的上一根柱子和下一根柱子都是固定的,所以结构就是就是柱子是两根,管子是一个。而对于0的单元格,它的左右柱子高度是不确定的,而它
左右柱子高度的选择也会影响到整体的造价,所以我们用到动态规划,从第一个单元格开始,依次遍历每个单元格,对于每个单元格,我们首先知道左边那根柱子高度为1和为2时的造价,然后
递推出右边那根柱子高度为1和2时各自的最优造价,这样依次递推下去,最后选择最后一根柱子高度为1时的结果就是整体的最优造价(因为确定了最后一根柱子高度为1)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[200100][2];
int main(){
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--){
int n, a, b;
cin >> n >> a >> b;
string s;
cin >> s;
dp[0][0] = b;
dp[0][1] = 1e15;
for(int i=0; i<n; i++){
if(s[i] == '0'){
dp[i+1][0] = min(dp[i][0] + a, dp[i][1] + a + a) + b;
dp[i+1][1] = min(dp[i][1] + a, dp[i][0] + a + a) + b + b;
}else{
dp[i+1][0] = 1e15;
dp[i+1][1] = dp[i][1] + a + b + b;
}
}
cout << dp[n][0] << endl;
}
return 0;
}

浙公网安备 33010602011771号