描述
在一个地图上有 n 个地窖( n≤200 ),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径,并规定路径都是单向的,且保证都是小序号地窖指向大序号地窖,也不存在可以从一个地窖出发经过若干地窖后又回到原来地窖的路径。某人可以从任一处开始挖地雷,然后沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使他能挖到最多的地雷。(注意有可能有重边)
输入描述
第一行:地窖的个数。
第二行为依次每个地窖地雷的个数。
下面若干行:
xi,yi 表示从 xi 可到 yi,xi最后一行为"0 0"表示结束。
输出描述
k1−k2−…−kv //挖地雷的顺序挖到最多的雷。
样例输入 1
6 5 10 20 5 4 5 1 2 1 4 2 4 3 4 4 5 4 6 5 6 0 0
样例输出 1
3-4-5-6 34
#include <bits/stdc++.h>
using namespace std;
int a[210], dp[210];
int g[210][210];
int pre[210];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
dp[i] = a[i];
}
int x, y;
while (cin >> x >> y)
{
if (x == 0 and y == 0)
{
break;
}
g[x][y] = 1;
}
for (int i = n - 1; i >= 1; i--)
{
int fmax = 0, path = 0;
for (int j = i + 1; j <= n; j++)
{
if (g[i][j] == 1 and dp[j] > fmax)
{
fmax = dp[j];
path = j;
}
}
dp[i] = fmax + a[i];
pre[i] = path;
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (dp[ans] < dp[i])
{
ans = i;
}
}
cout << ans;
int s = pre[ans];
while (s > 0)
{
cout << "-" << s;
s = pre[s];
}
cout << endl;
cout << dp[ans] << endl;
return 0;
}