题目链接

POJ

题解

背包树形dp板题

就是读入有点无聊,浪费了很多青春

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<string>
#include<cstring>
#include<algorithm>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define cls(s) memset(s,0,sizeof(s))
using namespace std;
const int maxn = 205,maxm = 50005,INF = 1000000000;
map<string,int> id;
int ls[maxn],rb[maxn],n,m,siz[maxn],fa[maxn],rt;
char s[maxm],name[maxn];
LL f[maxn][maxn],val[maxn];
void dfs(int u){
f[u][0] = 0; siz[u] = 1;
for (int k = ls[u]; k; k = rb[k]){
dfs(k); siz[u] += siz[k];
for (int i = n; i >= 0; i--)
for (int j = 0; j <= i; j++)
f[u][i] = min(f[u][i],f[u][i - j] + f[k][j]);
}
if (u != rt) f[u][siz[u]] = min(f[u][siz[u]],val[u]);
}
int main(){
int idx,x;
while(scanf("%s",s) > 0 && strcmp(s,"#") != 0){
id.clear(); idx = 0;
cls(fa); cls(rb); cls(ls); memset(f,0x3f3f3f3f,sizeof(f));
scanf("%d",&m); n = 0;
for(int i = 0; s[i] != '\0'; i++)
n = n * 10 + s[i] - '0';
rt = n + 1;
REP(i,n){
scanf("%s%d",name,&x);
if (id[name] == 0) id[name] = ++idx;
int u = id[name],to; val[u] = x;
while (getchar() != '\n'){
scanf("%s",name);
if (id[name] == 0) id[name] = ++idx;
to = id[name];
rb[to] = ls[u];
ls[u] = to;
fa[to] = u;
}
}
REP(i,n) if (!fa[i]){
fa[i] = rt;
rb[i] = ls[rt];
ls[rt] = i;
}
dfs(rt);
LL ans = f[rt][m];
for (int i = m + 1; i <= n; i++) ans = min(ans,f[rt][i]);
cout << ans << endl;
}
return 0;
}

POJ3345 Bribing FIPA 【背包类树形dp】的更多相关文章

  1. poj3345 Bribing FIPA【树形DP】【背包】

    Bribing FIPA Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5910   Accepted: 1850 Desc ...

  2. POJ3345 Bribing FIPA(树形DP)

    题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价. 这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP ...

  3. POJ3345 Bribing FIPA

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5021   Accepted: 1574 Description There ...

  4. 洛谷$2014$ 选课 背包类树形$DP$

    luogu Sol 阶段和状态都是树形DP板子题,这里只讲一下背包的部分(转移)叭 它其实是一个分组背包模型,具体理解如下: 对于一个结点x,它由它的子结点y转移而来 在子结点y为根的树中可以选不同数 ...

  5. CTSC1998 选课(背包类树形Dp)

    题意: 给出 n 节课的先修课号以及学分(先修课号指的是在学习某节课时先需要学习的课程),求学 m 节课的最大学分. 细节: 1.对于课程 a 其先修课号为 b ,对于课程 b 其先修课号为 c ,则 ...

  6. luogu2014 选课 背包类树形DP

    题目大意:有N门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课程b的先修课即只有学完了课程a,才能学习课程b).一个学生要从这些课程里选择M门课程学习,问他能获得的最大学分是多少? ...

  7. BZOJ5314 [Jsoi2018]潜入行动 【背包类树形dp】

    题目链接 BZOJ5314 题解 设\(f[i][j][0|1][0|1]\)表示\(i\)为根的子树,用了\(j\)个监测器,\(i\)节点是否被控制,\(i\)节点是否放置的方案数 然后转移即可 ...

  8. CH5402 选课【树形DP】【背包】

    5402 选课 0x50「动态规划」例题 描述 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了 N(N≤300) 门的选修课程,每个学生可选课程的数量 M 是 ...

  9. 「算法笔记」树形 DP

    一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \ ...

随机推荐

  1. Mybatis与Hibernate区别

    Mybatis与Hibernate区别 mybatis: 1. 入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美 ...

  2. Java源码解析——Java IO包

    一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...

  3. 利用pandas和numpy计算表中每一列的均值

    import numpy as np import pandas as pd df = pd.DataFrame({'var1':np.random.rand(100), #生成100个0到1之间的随 ...

  4. [Codeforces976E]Well played!(贪心)

    [不稳定的传送门] Solution 首先可以证明,hp翻倍的操作一定是在同一个生物上最优 Code #include <cstdio> #include <algorithm> ...

  5. js石头剪刀布小游戏

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title ...

  6. 9 10mins的投票功能

    1.投票的原理 2.投票的数据结构设计 (1)准备工作 导入detail页面 配置静态文件 <link rel="stylesheet" href="../stat ...

  7. loj2472 「九省联考 2018」IIIDX

    ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std ...

  8. 将有效慢日志转存到数据库v2

    import re import sys import getopt import MySQLdb from subprocess import call import os host='10.76. ...

  9. Activiti入门 -- 环境搭建和核心API简介

    相关文章: <史上最权威的Activiti框架学习指南> <Activiti入门 -- 轻松解读数据库> 本章内容,主要讲解Activiti框架环境的搭建,能够使用Activi ...

  10. Vbs 测试程序一

    转载请注明出处 有点小恶意哦!慎重测试 'This procedure is written in SeChaos, only for entertainment, not malicious com ...