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;
}
原文地址:https://www.cnblogs.com/ssNiper/p/11447716.html