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;
    }
  • 相关阅读:
    小故事
    设计模式
    git分支
    git简单操作
    ab命令压力测试
    libcheck ARM交叉编译
    libxml2 ARM 交叉编译
    I.MX6 安装LTIB
    为ARM编译Glib
    QT 4.8 中文显示问题
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10797844.html
Copyright © 2011-2022 走看看