zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    在DataGrid中创建一个点击列名时的弹出式窗口
    利用自定义事件实现不同窗体间的通讯 C#篇
    用javascript实现禁用鼠标右键
    刷新页面时,防止滚动条上滚
    web服务编程
    数据库链接Connection和DataReader的关闭
    .NET的WEB商业应用架构所要解决的若干
    zblog屏蔽分类文章
    过年随想
    mysql数据库文件的真实的物理存储位置
  • 原文地址:https://www.cnblogs.com/ssNiper/p/11447716.html
Copyright © 2011-2022 走看看