!-- Loading 底层遮罩 -->

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;
}

 

posted @ 2022-03-30 20:31  Thinker-X  阅读(36)  评论(0)    收藏  举报