您的位置:首页 > 大数据 > 人工智能

HDU 1224 Free DIY Tour (DP again!)

2012-07-08 00:17 363 查看
有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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: