zoukankan      html  css  js  c++  java
  • 洛谷 偷天换日&&“访问”美术馆

    典型的树形DP

    按理说是先做“访问美术馆”再做偷天换日。

    但是我先做了偷天换日然后再做的“访问”美术馆

    DP方程好推,偷天换日在遇到有展品的时候做背包,因为是先做的偷天换日,所以把偷天换日的输入w,c直接将输入改为赋值就A了。

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define MAXN 311
    using namespace std;
    struct node{
        int to, nxt, val;
    }edge[MAXN << 1];
    int flag, tot, n, head[MAXN], nxt[MAXN << 1], to[MAXN << 1], w[MAXN], val[MAXN << 1], dp[MAXN][MAXN << 1];
    void add(int u, int v, int w) {
        edge[++tot].nxt = head[u], head[u] = tot, edge[tot].to = v, edge[tot].val = w;
        edge[++tot].nxt = head[v], head[v] = tot, edge[tot].to = u, edge[tot].val = w;
    }
    void dfs(int now) {
        int t, x, flag1;
        scanf("%d%d", &t, &x);
        add(now, ++flag, t << 1);
        if(!x) flag1 = flag, dfs(flag1), dfs(flag1);
        else for(int i = 1, c, w; i <= x; i++) {
            scanf("%d%d", &w, &c);
    //        w = 1, c = 5;
            for(int j = n; j >= c; j--) dp[flag][j] = max(dp[flag][j], dp[flag][j - c] + w);
        }
    }
    void dfs1(int now, int fa) {
        for(int i = head[now]; i; i = edge[i].nxt)
            if(fa != edge[i].to) {
                dfs1(edge[i].to, now);
                for(int j = n; j >= 0; j--)
                    for(int k = edge[i].val; k <= j; k++)
                        dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[edge[i].to][k - edge[i].val]);
            }
    }
    int main() {
        scanf("%d", &n), n--;
        dfs(++flag);
        dfs1(1, 0);
        printf("%d", dp[1][n]);
        return 0;
    }

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #define MAXN 311
    using namespace std;
    struct node{
        int to, nxt, val;
    }edge[MAXN << 1];
    int flag, tot, n, head[MAXN], nxt[MAXN << 1], to[MAXN << 1], w[MAXN], val[MAXN << 1], dp[MAXN][MAXN << 1];
    void add(int u, int v, int w) {
        edge[++tot].nxt = head[u], head[u] = tot, edge[tot].to = v, edge[tot].val = w;
        edge[++tot].nxt = head[v], head[v] = tot, edge[tot].to = u, edge[tot].val = w;
    }
    void dfs(int now) {
        int t, x, flag1;
        scanf("%d%d", &t, &x);
        add(now, ++flag, t << 1);
        if(!x) flag1 = flag, dfs(flag1), dfs(flag1);
        else for(int i = 1, c, w; i <= x; i++) {
    //        scanf("%d%d", &w, &c);
            w = 1, c = 5;
            for(int j = n; j >= c; j--) dp[flag][j] = max(dp[flag][j], dp[flag][j - c] + w);
        }
    }
    void dfs1(int now, int fa) {
        for(int i = head[now]; i; i = edge[i].nxt)
            if(fa != edge[i].to) {
                dfs1(edge[i].to, now);
                for(int j = n; j >= 0; j--)
                    for(int k = edge[i].val; k <= j; k++)
                        dp[now][j] = max(dp[now][j], dp[now][j - k] + dp[edge[i].to][k - edge[i].val]);
            }
    }
    int main() {
        scanf("%d", &n), n--;
        dfs(++flag);
        dfs1(1, 0);
        printf("%d", dp[1][n]);
        return 0;
    }

    一世安宁

  • 相关阅读:
    SQL Server ----- 备份数据库 生成(.bak)文件
    SQL Server ----- 生成sql 脚本
    SQLServer --------- 将sql脚本文件导入数据库
    sql 语言--- DML,DDL,DQL,DCL,TCL,CCL
    装系统 ---------- 了解 UEFI与Legacy、硬盘分区MBR和GPT
    web基础(请求转发与重定向、二者区别)
    request(获取请求信息、用户提交的数据)
    response(向客户端写入数据、对相应进行设置(状态码、响应头))
    HttpServlet类(servlet的实现方式、doGet方法与get提交、doPost方法与post提交)
    servlet(API、配置文件、生命周期)
  • 原文地址:https://www.cnblogs.com/GTBD/p/10098434.html
Copyright © 2011-2022 走看看