C. Gas Pipeline
题意:略
题解:艹,表示到第
根柱子,且柱子高度为
的最小花费,
为0代表柱子高度为1,
为1表示柱子高度为2,字符串的长度为n,一共有n+1根柱子,柱子编号为1到n,则有初始条件
,其余初始化为
,
考虑 是否为‘0’,是的话两种高度的柱子都可建造,否则只可建造高度为2的柱子,答案为
,
时间复杂度为
代码:
# define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize(2)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <vector>
#include <queue>
#define Pair pair<int,int>
//#define int long long
#define fir first
#define sec second
using namespace std;
/*---------------------------------------------------------------------------------------------------------------------------*/
const int N = 2e5 + 5;
const double pi = acos(-1.0);
typedef long long ll;
//const int mod = 998244353;
const int mod = 1e9 + 7;
#define inf 0x3f3f3f3f
struct something {
int num, period, time;
bool operator < (const something& y)const {
return y.time < time || (y.time == time && y.num < num);
}
something() {}
something(int num, int period, int time) :num(num), period(period), time(time) {}
};
int dx[8] = { 0, 0, 1,-1, 1, 1,-1,-1 };
int dy[8] = { 1,-1, 0, 0, 1,-1, 1,-1 };
char str[N];
ll f[N][2];
signed main() {
int t;
scanf("%d", &t);
while (t--) {
memset(f, 0x3f, sizeof f);
int n, a, b;
scanf("%d%d%d", &n, &a, &b);
getchar();
scanf("%s", str + 1);
//str[n + 1] = '0';
//printf("%s\n", str + 1);
f[1][0] = b;
for (int i = 2; i <= n + 1; i++) {
if (str[i - 1] == '0') {
f[i][0] = min(f[i - 1][0] + a + b, f[i - 1][1] + 2 * a + b);
f[i][1] = min(f[i - 1][0] + 2 * b + 2 * a, f[i - 1][1] + 2 * b + a);
}
else f[i][1] = f[i - 1][1] + 2 * b + a;
}
printf("%lld\n", f[n + 1][0]);
}
return 0;
}