zoukankan      html  css  js  c++  java
  • 挖地雷(动态规划)

    思路:

    设dp[ i ]为到达 i  点时的最多的地雷,这是一个经典的DAG最长路径问题。所以,起点为任意入度为0的点,终点为任意出度为0的点。  

    但是这道还是非常特殊的,特殊就在 1 点一定是个入度为0的点, n 点一定为出度为0的点。 那么就不用递归来求, dp[ i ]了。

    这道题的推导就是 dp[ j ]= max{ a[ j ]+dp[ i ] }; 

    #include<iostream>
    #include<cstring>
    using namespace std;
    const int maxn = 30;
    int map[maxn][maxn], a[maxn], pre[maxn], dp[maxn];
    int n;
    
    void path(int x){
        if (!pre[x]){ cout << x; return; }
        path(pre[x]);
        cout << " " << x;
        return;
    }
    
    int main(){
        cin >> n;
        for (int i = 1; i <= n; ++i)
            cin >> a[i];
        for (int i = 1; i <= n - 1;++i)
        for (int j = i + 1; j <= n; ++j)
            cin >> map[i][j];
        for (int i = 1; i <= n; ++i)
            dp[i] = a[i];
    
        for (int i = 1; i <= n - 1;++i)
        for (int j = i + 1; j <= n;++j)
        if (map[i][j]){
            int sum = a[j] + dp[i];
            if (dp[j] < sum){ pre[j] = i; dp[j] = sum; }
        }
        int maxx = 1;
        for (int i = 1; i <= n;++i)
        if (dp[maxx] < dp[i])maxx = i;
        path(maxx);  cout << endl;
        cout << dp[maxx] << endl;
    }
  • 相关阅读:
    互斥量
    读写锁
    死锁
    pthread
    线程
    守护进程
    信号捕捉
    信号集
    信号
    mmap
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10797844.html
Copyright © 2011-2022 走看看