제출 #1071237

#제출 시각아이디문제언어결과실행 시간메모리
1071237vjudge1Art Exhibition (JOI18_art)C++17
0 / 100
1 ms4444 KiB
#include <bits/stdc++.h>
#define int long long
#define boost ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define file(s) freopen(s".in", "r", stdin); freopen(s".out", "w", stdout)
const int N=1e5+1;
const int inf=1e18;
const int mod=1e9+7;
using namespace std;
int n;
struct edge{
	int ans,mx,mn,sum;
};
vector<edge>v1;
vector<pair<int,int> >v;
edge dp[5001][5001];
signed main(){
	boost;
	int n;
	cin>>n;
	v.push_back({0,0});
	for(int i=0;i<n;i++){
		int x,y;
		cin>>x>>y;
		v.push_back({x,y});
	}
	int ans=0;
	int mx=0;
	int mn=0;
	int sum=0;
	for(int i=1;i<=n;i++){
		if(ans<v[i].second){
			ans=v[i].second;
			mx=v[i].first;
			mn=v[i].first;
			sum=v[i].second;
		}
		dp[1][i].ans=ans;
		dp[1][i].mx=mx;
		dp[1][i].mn=mn;
		dp[1][i].sum=sum;
	}
	for(int i=2;i<=n;i++){
		int ans1=-inf;
		int mx1=0;
		int mn1=0;
		int sum1=0;
		for(int j=i;j<=n;j++){
			int mx=max(v[j].first,dp[i-1][j-1].mx);
			int mn=min(v[j].first,dp[i-1][j-1].mn);
			int sum=v[j].second+dp[i-1][j-1].sum;
			int ans=sum-(mx-mn);
			if(ans>ans1){
				ans1=ans;
				mx1=mx;
				mn1=mn;
				sum1=sum;
			}
			dp[i][j].ans=ans1;
			dp[i][j].mx=mx1;
			dp[i][j].mn=mn1;
			dp[i][j].sum=sum1;
		}
	}
	ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,dp[i][n].ans);
	}
	cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...