• zoj 3471 Most Powerful (有向图)最大生成树 状压dp


    题目链接

    题意

    (N)种气体,(i)气体与(j)气体碰撞会:

    1. 产生(a[i][j])的威力;
    2. 导致(j)气体消失。

    求产生威力之和的最大值。

    思路

    和前几题找图上路径的题不一样,该题如果抽象成图上的问题,则为:
    在有向连通图中找一棵树,对于每一对((parent,child))关系对,(parent)相当于这里的气体(i)(child)相当于这里的气体(j),要使得树上的边权值最大。

    但状态的表示倒是仍然可以借鉴。

    状态(1)表示消失了的气体,(0)表示仍存在的气体。
    (dp[state][p]):表示(p)气体消失后到达(state)时的威力最大值。

    所以应采用二重循环,一重在所有的(1)中枚举消失了的气体,另一重在所有的(0)中枚举使之消失的气体。

    Code

    #include <bits/stdc++.h>
    #define F(i, a, b) for (int i = (a); i < (b); ++i)
    #define F2(i, a, b) for (int i = (a); i <= (b); ++i)
    #define dF(i, a, b) for (int i = (a); i > (b); --i)
    #define dF2(i, a, b) for (int i = (a); i >= (b); --i)
    #define maxn 10
    #define maxs 1100
    using namespace std;
    typedef long long LL;
    int n, dp[maxs][maxn], dis[maxn][maxn];
    bool vis[maxs][maxn];
    int dfs(int state, int p) {
        if (!state) return 0;
        if (vis[state][p]) return dp[state][p];
        vis[state][p] = true;
        int sta = state - (1<<p), ans = 0;
        F(i, 0, n) {
            if (!(sta&(1<<i))) continue;
            int temp = dfs(sta, i);
            F(j, 0, n) {
                if (!(sta&(1<<j))) ans = max(ans, temp+dis[j][i]);
            }
        }
        return dp[state][p] = ans;
    }
    void work() {
        memset(dis, 0, sizeof dis);
        memset(dp, 0, sizeof dp);
        memset(vis, 0, sizeof vis);
        F(i, 0, n) {
            F(j, 0, n) {
                scanf("%d", &dis[i][j]);
            }
        }
        int ans = 0;
        F(i, 0, n) {
            int state = (1<<n)-1-(1<<i);
            F(j, 0, n) {
                if (i==j) continue;
                ans = max(ans, dfs(state, j)+dis[j][i]);
            }
        }
        printf("%d
    ", ans);
    }
    int main() {
        while (scanf("%d",&n)!=EOF&&n) work();
        return 0;
    }
    
    
    
  • 相关阅读:
    情书2
    情书1
    python_数据分析_正态分布
    python3调用R语言干货
    常见混淆名词
    PID算法图形 python
    A*寻路算法 python实现
    用tensorflow object detection api做手势识别
    tf识别非固定长度图片ocr(数字+字母 n位长度可变)- CNN+RNN+CTC
    tf识别固定长度验证码图片ocr(0到9 4位)- CNN方式
  • 原文地址:https://www.cnblogs.com/kkkkahlua/p/8452079.html
Copyright © 2020-2023  润新知