首先想到三维的dp[i][j][k],表示处理前i个程序,cpu1最后处理类型j,cpu2最后处理类型k。
然后发现更新之后一定存在j或者k为a[i]。所以可以优化掉一维。
则考虑是否和前一个用同一cpu处理。
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
typedef pair<int, int> pii;
#define int long long
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
int dp[5005][5005];
int a[5005];
int ht[5005];
int cd[5005];
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
for (int i = 1; i <= k; i++) {
cin >> cd[i];
}
for (int i = 1; i <= k; i++) {
cin >> ht[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= k; j++) {
dp[i][j] = 1e18;
}
}
dp[1][0] = cd[a[1]];
for (int i = 2; i <= n; i++) {
int last = a[i - 1];
for (int j = 0; j <= k; j++) {
dp[i][j] = min(dp[i][j], dp[i - 1][j] + (a[i] == last ? ht[a[i]] : cd[a[i]]));
dp[i][last] = min(dp[i][last], dp[i - 1][j] + (a[i] == j ? ht[a[i]] : cd[a[i]]));
}
}
int ans = 1e18;
for (int i = 0; i <= k; i++) {
ans = min(ans, dp[n][i]);
}
cout << ans << endl;
}
return 0;
}