Codeforces 1207 C. Gas Pipelin (Linear DP)

Keywords: REST

C. Gas Pipeline

A little bit

Solution:Express toRoot pillar, and the height of the pillar isMinimum cost,0 represents the height of the column 1.1 means the height of the column is 2, the length of the string is n, there are n+1 columns in all, and the number of the column is 1 to n, then there are initial conditions.The rest is initialized to,

ConsiderIf it is `0', yes, both height pillars can be constructed, otherwise only 2 height pillars can be constructed. The answer is `0'.

The time complexity is

Code:

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

 

Posted by morganchia on Tue, 08 Oct 2019 15:41:27 -0700