zoukankan      html  css  js  c++  java
  • Born Slippy (超大背包问题 + 树形DP)

    首先是需要我们知道的是假设又一条链给你让你求最大值,你会求吗?当然会,就是时间有点爆炸O(n2)。那不行,要是如果我把到达每个点的最大值以及他对后面的贡献情况都求出来后放在数组里面,然后到了新的节点直接查询该点的情况,但是问题就在于我们存进数组的时候遍历了O(1 << 16)那么时间还是不可以过,这时候需要使用大背包的想法,我们只把后面8为的结果打出来并存进数组,然后查询的时候只需要查询前8位,这样一来是不是时间就又优化到了允许的范围内了。还有就是我在树上面跑的时候会有重复的状况,就是两条链共用了同一套数据,那么只需要记录一下,然后回溯就可以便面这个问题了。

    然后还有一个问题就是,我下载了数据,然后去跑一下,发现一个问题,就是我的电脑由于递归层数过多导致炸内存。所以就是买个大一点的内存可以更加为所欲为。

    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    const int mod  = 1e9 + 7;
    const int maxn = (1 << 16) + 7;
    const int maxm = (1 << 8) + 7;
    vector<int>vec[maxn];
    LL tmp[maxn][maxm], dp[maxm][maxm], w[maxn], ans;
    int vis[maxm];
    char str[10];
    
    
    int opt(int a, int b){
        if(str[0] == 'X') return a ^ b;
        if(str[0] == 'A') return a & b;
        if(str[0] == 'O') return a | b;
    }
    
    void dfs(int rt){
        LL ret = 0;
        LL a = w[rt] >> 8;
        LL b = w[rt] & 255;
        for(int i = 0; i < 256; i ++)
            if(vis[i]) ret = max(ret, dp[i][b] + (opt(i, a) << 8));
    
        ans = (1LL * rt * (ret + w[rt]) + ans) % mod;
        vis[a] ++;
        for(int i = 0; i < 256; i ++)
            tmp[rt][i] = dp[a][i],
            dp[a][i] = max(dp[a][i], ret + opt(b, i));
        for(int i = vec[rt].size() - 1; i >= 0; i --)
            dfs(vec[rt][i]);
        for(int i = 0; i < 256; i ++)
            dp[a][i] = tmp[rt][i];
        vis[a] --;
    }
    
    int main(){
        int T,n,rt;scanf("%d",&T);
        while(T --){
            scanf("%d%s",&n, str);ans = 0;
            memset(dp, 0, sizeof(dp));
            memset(vis, 0, sizeof(vis));
            for(int i = 1; i <= n; i ++)scanf("%lld",&w[i]),vec[i].clear();
            for(int i = 2; i <= n; i ++)scanf("%d",&rt),vec[rt].push_back(i);
            dfs(1);printf("%lld
    ",ans);
        }
        return 0;
    }
    more crazy more get!
  • 相关阅读:
    pads layout模块复用-两个不同功能的复用模块功能
    摘抄:一个电容都能讲得如此全面实用,不分享就太可惜了!
    layout需要非常了解清楚的内容
    摘抄:一篇文章看看能不能讲透“阻抗匹配”
    python2.7/3.7安装NumPy函数库的一种方法及小心得
    3.C#基础之基本概念(完成)
    2.C#基础之词法结构(完成)
    .NET、.NET框架、ASP.NET和C#的关系(完成)
    1.C#基础之简介(完成)
    2.LINQ(新手写的!新手写的!新手写的!)(未完成)
  • 原文地址:https://www.cnblogs.com/wethura/p/9744075.html
Copyright © 2011-2022 走看看