题目描述
在一个地图上有N个地窖(N≤20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入输出样例
输入 #1复制
5
10 8 4 7 6
1 1 1 0
0 0 0
1 1
1
输出 #1复制
1 3 4 5
27
解体思路:以 sum[i] 表示从起点到点i时挖到地雷的最大数,当 i与 j 相连,另一点sum[j] 取到最大值时,就得到了递推式sum[i]=sum[j]+b[i],将点下标保存在c[i]中,根据最后点下标,进行递归输出。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int a[20][20],b[20],c[20],maxsum,sum[20],n,pos;
void print(int x)
{
if (c[x] == 0)
{
cout << x;
return;
}
print(c[x]);
cout << ' ' << x;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) cin >> b[i];
for (int i = 1; i <= n-1; i++)
for (int j = i + 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (a[j][i])
{
sum[i] = max(sum[i], sum[j]);
if (sum[i] == sum[j]) c[i] = j;
}
}
sum[i] += b[i];
maxsum = max(maxsum, sum[i]);
if (maxsum == sum[i]) pos = i;
}
print(pos);
cout <<endl<< maxsum << endl;
return 0;
}
计算机202 张