和修繕長城uva1336一起看
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<sstream>
#include<cassert>
using namespace std;
const int maxn = 100 + 5;
int kase, n;
int p[maxn], v[maxn];
int d[maxn][maxn][maxn][2];
int vis[maxn][maxn][maxn][2];
int dp(int s, int e, int cnt, int pos) {//pos=0 on s; pos=1 on e
if (cnt == 0)return 0;
int &ans = d[s][e][cnt][pos];
if (vis[s][e][cnt][pos])return ans;
vis[s][e][cnt][pos] = 1;
if (pos) {
for (int i = 0; i < s; i++) {
ans = max(ans, v[i] - cnt * abs(p[i] - p[e]) + dp(i, e, cnt - 1, 0));
}
for (int i = e+1; i < s; i++) {
ans = max(ans, v[i] - (abs(p[i] - p[e])*cnt) + dp(s, i, cnt-1, 1));
}
}
else {
for (int i = 0; i < s; i++) {
ans = max(ans, v[i] - cnt * abs(p[i] - p[s]) + dp(i, e, cnt - 1, 0));
}
for (int i = e + 1; i < s; i++) {
ans = max(ans, v[i] - (abs(p[i] - p[s])*cnt) + dp(s, i, cnt - 1, 1));
}
}
}
int main() {
cin >> kase;
while (kase--) {
cin >> n;
for (int i = 0; i < n; i++)cin >> p[i];
for (int i = 0; i < n; i++)cin >> v[i];
int ans = 0;
for (int k = 1; k < n; k++) {
for (int j = 0; j < n; j++) {
ans = max(ans, v[j] - k * abs(p[j]) + dp(j, j, k - 1, 0));
}
}
}
return 0;
}