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; }