#include<bits/stdc++.h>
#define int long long
#define _for(i, a, b) for(int i = a;i < b;++i)
#define _rep(i, a, b) for(int i = a;i <= b;++i)
int readll(){int x; scanf("%lld", &x); return x;}
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 100 + 5;
int dp[maxn][maxn], martix[maxn][maxn];//dp[i][j]: i->j minimum cost, martix[i][j]: i->j distance
int L1, L2, L3, C1, C2, C3, A, B, N;
int judge(int x){
if(x > L2) return C3;
if(x > L1) return C2;
return C1;
}
signed main(){
cin>>L1>>L2>>L3>>C1>>C2>>C3>>A>>B>>N;
memset(dp, INF, sizeof(dp));
_rep(i, 2, N) martix[1][i] = martix[i][1] = readll();
_for(i, 1, N){
dp[i][i] = 0;
int j = i + 1;
dp[i][j] = judge(abs(martix[1][j] - martix[1][i]));
}
dp[N][N] = 0;
_for(dis, 2, N){//对角线差值
int len = N - dis;//当前对角线遍历的长度
_rep(i, 1, len){
int j = i + dis;
int temp = abs(martix[1][j] - martix[1][i]);
if(temp <= L3) dp[i][j] = min(judge(temp), dp[i][j]);
_for(k, i + 1, j) dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
}
}
/*
cout<<endl;
_rep(j, 1, N){
_rep(i, j, N) cout<<dp[i][j]<<' ';
cout<<endl;
}
*/
cout<<dp[A][B]<<endl;
return 0;
}
区间dp



京公网安备 11010502036488号