Submission #1322491

#TimeUsernameProblemLanguageResultExecution timeMemory
1322491aaaaaaaaSkyline (IZhO11_skyline)C++20
0 / 100
46 ms100676 KiB
#include <bits/stdc++.h>
using namespace std;


#define int long long

const int inf = 2e18;

const int mxN = 305;

int dp[mxN][205][205], a[mxN];


signed main(){
	ios::sync_with_stdio(0);
	cin.tie(nullptr); cout.tie(nullptr);
	int n; cin >> n;
	for(int i = 1; i <= n; ++i){
		cin >> a[i];
	}
	for(int i = 0; i < mxN; ++i){
		for(int j = 0; j < 205; ++j){
			for(int k = 0; k < 205; ++k){
				dp[i][j][k] = 0x3f;
			}
		}
	}
	if(n == 1){
		cout << a[1] * 3 << "\n";
	}else if(n == 2){
		cout << min(a[1], a[2]) * 5 + abs(a[1] - a[2]) * 5 << "\n";
	}else{
		for(int i = 0; i <= a[1]; ++i){
			dp[1][0][a[i] - i] = dp[2][a[1] - i][a[2]] = i * 3;
		}
		for(int i = 2; i <= n; ++i){
			for(int prev = a[i - 1]; prev >= 0; --prev){
				for(int cur = a[i]; cur >= 0; --cur){
					dp[i][prev][cur] = min(dp[i][prev][cur], dp[i][prev][cur + 1] + 3);
				}
			}
			for(int prev = a[i - 1]; prev >= 0; --prev){
				for(int cur = a[i]; cur >= 0; --cur){
					dp[i][prev][cur] = min(dp[i][prev][cur], dp[i][prev + 1][cur + 1] + 5);
				}
			}
			if(i == n) break;
			for(int j = min({a[i - 1], a[i], a[i + 1]}); j >= 0; --j){
				for(int cur = a[i]; cur >= j; --cur){
					dp[i + 1][cur - j][a[i + 1] - j] = min(dp[i + 1][cur - j][a[i + 1] - j], dp[i][j][cur] + 7ll * j);
				}
			}
		}
		cout << dp[n][0][0] << "\n";
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...