제출 #400246

#제출 시각아이디문제언어결과실행 시간메모리
400246kgh3620스카이라인 (IZhO11_skyline)C++17
0 / 100
108 ms50116 KiB
#include <map>
#include <set>
#include <list>
#include <cmath>
#include <ctime>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <limits>
#include <vector>
#include <cstdlib>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional> 
#include <iomanip>
#include <unordered_map>
#include <memory.h>
#include <unordered_set>
#include <fstream>
#include <random>

using namespace std;

int h[301];
int dp[305][205][205];

int main(void)
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	int n;

	cin >> n;

	for (int i = 0; i < n; i++)
	{
		cin >> h[i];
	}

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

	for (int i = 0; i <= 300; i++)
	{
		for (int j = 0; j <= 200; j++)
		{
			for (int k = 0; k <= 200; k++)
			{
				dp[i][j][k] = 1e9;
			}
		}
	}

	dp[0][0][0] = 0;

	for (int i = 0; i < n + 2; i++)
	{
		for (int j = 200; j>=0; j--)
		{
			for (int k = 200;k>=0;k--)
			{
				if (dp[i][j][k] >= 1e9)
				{
					continue;
				}
				if (k - 1 >= 0)
				{
					dp[i][j][k-1] = min(dp[i][j][k-1], dp[i][j][k] + 3);
				}
				if (j - 1 >= 0 && k - 1 >= 0)
				{
					dp[i][j - 1][k - 1] = min(dp[i][j - 1][k - 1], dp[i][j][k] + 5);
				}
				if (h[i] >= j && k >= j)
				{
					dp[i + 1][k - j][h[i] - j] = min(dp[i + 1][k - j][h[i] - j], dp[i][j][k] + 7 * j);
				}
			}
		}

	}

	cout << dp[n+2][0][0] << '\n';

	return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…