有N個城市,從某城市出發到到終點城市,每次經過一個城市都會得一定的分數,但不是每個城市間都是連通的,圖中無環路,並且單向。問怎樣走得分最高。
DFS應該也可以做,不過看起來用DP思路更簡單些,依次對每個城市求最大值,只要把該城市的分數加上能夠到達該城市的其他城市的分數相加,並記錄路線即可。
#include<iostream>
#include<vector>
using namespace std;
struct {
int point;
int prev_node;
} dp[110];
bool map[110][110];
int point[110];
int main(){
int T, caseNo = 0;
cin >> T;
while(T--){
int N;
cin >> N;
for(int i = 1; i < N + 1; i++){
cin >> point[i];
}
point[N + 1] = 0;
for(int i = 1; i < N + 2; i++)
for(int j = 1; j < N + 2; j++)
map[i][j] = false;
int M;
cin >> M;
for(int i = 0; i < M; i++){
int x, y;
cin >> x >> y;
map[x][y] = true;
}
dp[1].point = 0;
for(int i = 2; i < N + 2; i++){
int MAX = -1;
int maxPos;
for(int j = 1; j < i; j++)
if(map[j][i]){
if(MAX < dp[j].point){
MAX = dp[j].point;
maxPos = j;
}
}
if(MAX != -1){
dp[i].point = dp[maxPos].point + point[i];
dp[i].prev_node = maxPos;
}else{
dp[i].point = -1;
dp[i].prev_node = -1;
}
}
vector<int> result;
result.push_back(1);
int i = N + 1;
while(i != 1){
int temp = dp[i].prev_node;
result.push_back(temp);
i = temp;
}
cout << "CASE " << ++caseNo << "#" << endl;
cout << "points : " << dp[N + 1].point << endl;
cout << "circuit : ";
for(int i = result.size() - 1; i >= 1; i--)
cout << result[i] << "->";
cout << 1 << endl;
if(T != 0)
cout << endl;
}
}