P2196 挖地雷
思路
题目要求需要输出路径,所以需要一个数组来记录每个点最优选择的前驱,同时最后起点可能不是1,需要遍历dp数组来确定起点。
代码
#include<iostream>
using namespace std;
int Gap[30][30], value[30], foot[30], N, dp[30];
int main(void)
{
cin >> N;
dp[N] = value[N];
for (int i = 1; i <= N; i++)
cin >> value[i], dp[i] = value[i];
for (int i = 1; i <= N - 1; i++)
for (int j = i + 1; j <= N; j++)
cin >> Gap[i][j];
for (int i = N - 1; i >= 1; i--)
{
for (int j = i + 1; j <= N; j++)
{
if (Gap[i][j] && dp[j] + value[i] > dp[i])
{
dp[i] = dp[j] + value[i];
foot[i] = j;
}
}
}
int step = 1;
for (int i = 1; i <= N; i++)
if (dp[i] > dp[step])
step = i;
int ans = dp[step];
cout << step;
while (foot[step]) {
cout << " " << foot[step];
step = foot[step];
}
cout <<endl<< ans;
return 0;
}

浙公网安备 33010602011771号