uva1628 最優路徑問題

和修繕長城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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章