Submission #1193110

#TimeUsernameProblemLanguageResultExecution timeMemory
1193110loomVisiting Singapore (NOI20_visitingsingapore)C++20
100 / 100
162 ms636 KiB
#include<bits/stdc++.h>
using namespace std;
#define inf 1e9
#define nl '\n'

int ldp[5001][2][2];
int  dp[5001][2][2];

inline void solve(){
	int k, n, m, a, b;
	cin>>k>>n>>m>>a>>b;
	a *= -1, b *= -1;

	int v[k+1], s[n+1], t[m+1];
	for(int i=1; i<=k; i++) cin>>v[i];
	for(int i=1; i<=n; i++) cin>>s[i];
	for(int i=1; i<=m; i++) cin>>t[i];

	for(int i=0; i<=m; i++){
		ldp[i][0][0] = -2*a - i*b;
		ldp[i][0][1] = ldp[i][1][0] = ldp[i][1][1] = -inf;
	}

	int ans = -a - m*b;
	for(int i=1; i<=n; i++){
		dp[0][0][0] = -2*a - i*b;
		dp[0][0][1] = dp[0][1][0] = dp[0][1][1] = -inf;

		for(int j=1; j<=m; j++){
			dp[j][0][0] = max({ldp[j-1][0][0], ldp[j-1][0][1] - a, ldp[j-1][1][0] - a, ldp[j-1][1][1] - 2*a}) - 2*b;

			dp[j][0][1] = max(ldp[j][0][1], ldp[j][1][1] - a) - b;

			dp[j][1][0] = max(dp[j-1][1][0], dp[j-1][1][1] - a) - b;

			dp[j][1][1] = -inf;
			if(s[i] == t[j]) dp[j][1][1] = v[s[i]] + max({ldp[j-1][0][0], ldp[j-1][0][1], ldp[j-1][1][0], ldp[j-1][1][1], (j == 1 ? 0 : -a) - (j-1)*b});
			ans = max(ans, dp[j][1][1] - (j == m ? 0 : a) - (m-j)*b);
		}

		for(int j=0; j<=m; j++) for(int k=0; k<2; k++) for(int l=0; l<2; l++) ldp[j][k][l] = dp[j][k][l];
	}

	cout<<ans;
}

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

	int t = 1;
	//cin>>t;
	while(t--) solve();

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...