Submission #761563

#TimeUsernameProblemLanguageResultExecution timeMemory
761563MetalPowerSkyline (IZhO11_skyline)C++14
100 / 100
111 ms113620 KiB
#include <bits/stdc++.h>
using namespace std;

const int MX = 305;
const int INF = 1e9 + 7;

int N, h[MX], memo[MX][MX][MX];

int dp(int i, int p1, int p2){
	if(i == N){
		return min(p1, p2) * 2 + max(p1, p2) * 3;
		return 0;
	}
	if(memo[i][p1][p2] != -1) return memo[i][p1][p2];
	if(p2 == 0) return dp(i + 1, h[i], p1);

	int mn = INF;

	if(p1 > 0 && p2 > 0) mn = min(mn, dp(i, p1 - 1, p2 - 1) + 5);

	int tot = 0;
	int rem3 = min(h[i], min(p1, p2));
	int currh = h[i] - rem3, currp1 = p1 - rem3, currp2 = p2 - rem3;
	tot += 7 * rem3;

	int rem2 = min(currp1, currp2);
	currp1 -= rem2;
	currp2 -= rem2;
	tot += 5 * rem2;

	tot += 3 * currp2;

	mn = min(mn, dp(i + 1, currh, currp1) + tot);
	return memo[i][p1][p2] = mn;
}

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> N;
	for(int i = 0; i < N; i++) cin >> h[i];

	if(N == 1){
		cout << h[0] * 3 << '\n';
		return 0;
	}else if(N == 2){
		cout << min(h[0], h[1]) * 5 + (max(h[0], h[1]) - min(h[0], h[1])) * 3 << '\n';
		return 0;
	}

	memset(memo, -1, sizeof memo);
	cout << dp(2, h[1], h[0]) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...