【思路分析】

比赛的时候想到了用我确实也想到了树形DP,但是状态没有确定对,连样例都没有过

PS:这是第二道发现还可以用状态作为答案最后输出的题目

正解:树形DP(背包)

按照读进来的数据,我们先建一棵树

像这样(这里用vector存图)

	for(int i=1;i<=n;++i){
	int x=read(),y=read();
a[i]=x; v[y].push_back(i);//从父节点建一条边连向子节点
}
然后就是DP的过程
(本人见到的树形DP题目比较少,但是做到过相关的题目似乎都是想这样子的)

void dfs(int x){

***********************//这里写初始化,或者边界判断

for(int i=0;i<v[x].size();i++){

int nxt=v[x][i];

dfs(nxt);//先处理它的子树

************************//这里写转移方程

}

***************************//这里进行后续操作

}

确定了是树形dp之后,我们来想一下转移方程

f[i][j][1]表示i节点分配j个亲缘关系取后最多的产奶量

f[i][j][0]表示该节点分配j个亲缘关系不取后最多的产奶量

然后像背包一样

我们给第i个子树分配j个关系

可以得出方程

方程:

(未加初始化与后续处理)
f[x][j][0]=max(f[x][j][0],f[x][j-k][0]+max(f[nxt][k][0],f[nxt][k][1])),
f[x][j][1]=max(f[x][j][1],f[x][j-k][1]+max(k==0?-0x3f3f3f3f:f[nxt][k-1][1],f[nxt][k][0]));

AC代码大概是这样的:

代码:

#include<cstdio>
#include<cmath>
#include<cctype>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
using namespace std;
inline int read()
{
char chr=getchar();
int f=1,ans=0;
while(!isdigit(chr)) {if(chr=='-') f=-1;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<1)+(ans<<3)+chr-'0';chr=getchar();}
return ans*f;
} inline void kai()
{
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
}
int n,m,a[505];
vector<int> v[505];
int f[505][505][2];
void dfs(int x){
for(int i=1;i<=n;i++) f[x][i][0]=f[x][i][1]=-0x3f3f3f3f;//预处理
for(int i=0;i<v[x].size();i++){
int nxt=v[x][i];
dfs(nxt);//遍历子树
for(int j=n;j>=0;j--)
for(int k=0;k<=j;k++)
f[x][j][0]=max(f[x][j][0],f[x][j-k][0]+max(f[nxt][k][0],f[nxt][k][1])),
f[x][j][1]=max(f[x][j][1],f[x][j-k][1]+max(k==0?-0x3f3f3f3f:f[nxt][k-1][1],f[nxt][k][0]));//方程
}
for(int i=0;i<=n;i++) f[x][i][1]+=a[x];//后续处理
}
int ans=0,maxn=0;
int main(){
n=read();
m=read();
for(int i=1;i<=n;++i){
int x=read(),y=read();
a[i]=x; v[y].push_back(i);//建树
}
dfs(0);//建一个“超级节点”(所有没有祖先的根节点都连到了0上)
int i;
for(i=n;i;i--) if(f[0][i][0]>=m) break;//用状态来做答案,找到第一个产奶量最多的亲缘关系(倒续找,所以最先找到的就是最大的)
cout<<i;
return 0;
}

【Usaco2006Mar】Milk Team Select产奶比赛的更多相关文章

  1. bzoj1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 树形dp

    题目链接 bzoj1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 题解 dp[i][j][0 / 1] 以i为根的子数中 相邻点对选了j个的最大价值 代码 #i ...

  2. 1722: [Usaco2006 Mar] Milk Team Select 产奶比赛

    1722: [Usaco2006 Mar] Milk Team Select 产奶比赛 https://www.lydsy.com/JudgeOnline/problem.php?id=1722 分析 ...

  3. 「BZOJ1722」「Usaco2006 Mar」Milk Team Select产奶比赛 解题报告

    Milk Team Select 产奶比赛 Description Farmer John's N (\(1 \le N \le 500\)) cows are trying to select th ...

  4. [BZOJ1722]Milk Team Select 产奶比赛

    Description Farmer John's N (1 <= N <= 500) cows are trying to select the milking team for the ...

  5. BZOJ1722 [Usaco2006 Mar] Milk Team Select 产奶比赛

    直接树形dp就好了恩 令$f[i][j][t]$表示以$i$为根的子树,选出来的点存在$j$对父子关系,$t$表示$i$这个点选或者没选,的最大产奶值 分类讨论自己和儿子分别有没有选,然后转移一下就好 ...

  6. BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1017  Solved: ...

  7. 【BZOJ-1717】Milk Patterns产奶的模式 后缀数组

    1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 881  Solved:  ...

  8. 【BZOJ】【1717】【USACO 2006 Dec】Milk Patterns产奶的模式

    后缀数组 o(︶︿︶)o 唉傻逼了一下,忘了把后缀数组的字典范围改回20001,直接21交了上去,白白RE了两发……sigh 既然要找出现了K次的子串嘛,那当然要用后缀数组了>_>(因为我 ...

  9. bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

    后缀数组+二分答案+离散化.(上次写的时候看数据小没离散化然后一直WA...写了lsj师兄的写法. #include<cstdio> #include<cstring> #in ...

随机推荐

  1. Python 之糗事百科多线程爬虫案例

    import requests from lxml import etree import json import threading import queue # 采集html类 class Get ...

  2. 获取CAD安装路径

    bool GetAcadPath(CString &acadPath) { DWORD dwRet=:GetModuleFileName(acedGetAcadWinApp()->m_h ...

  3. anguar相关

    1.创建组件 在某目录下创建组件  ng g c content/membersManage 2.创建服务 在某目录下创建服务  ng g service services/storage 2.创建模 ...

  4. chrome浏览器处理本地Ajax跨域

    chrome浏览器下 项目开发过程中,用到了Ajax异步请求.若将项目放在本地服务器中,通过localhost访问文件,不会报错.若直接通过file://访问文件就会报错. 报错信息: XMLHttp ...

  5. pip/pip3国内源

    Error 在使用pip3安装PySide2时出现ReadTimeoutError. $ pip3 install PySide2 Solution 使用国内源 例如: $ pip3 install ...

  6. Codeforces 939D - Love Rescue

    传送门:http://codeforces.com/contest/939/problem/D 本题是一个数据结构问题——并查集(Disjoint Set). 给出两个长度相同,且仅由小写字母组成的字 ...

  7. Bitvise ssh client+ chrome +SwitchyOmega *** (xjl456852原创)

    首先这个比ss还要简单,ss还需要在vps上搭建服务器.这个不需要. 但是无论是ss 还是 bitvise 都需要有一个自己的vps才行. 首先打开Bitvise ssh client程序:     ...

  8. N天学习一个linux命令之rsync

    用途 主要用于本地和远程主机同步文件 特性 1 使用增量传输算法(delta-transfer algorithm) 2 支持ssh,rsync协议 3 可以用于本地同步文件 4 本地和远程主机都需要 ...

  9. Eclipse ADT 导入别的电脑开发的项目

    用Eclipse开发的时候常常要导入别的电脑开发的项目,常常会出错,甚至导入不了. 方法一: 把你正在使用的Eclipse开发的随便一个项目.打开,把下图这三个文件复制过去你要导入的项目.覆盖.然后再 ...

  10. 单点登录cas常见问题(八) - 什么时候会用到代理proxy模式?

    举一个样例:有两个应用App1和App2,它们都是受Casserver保护的,即请求它们时都须要通过Cas server的认证. 如今须要在App1中通过Http请求訪问App2,显然该请求将会被Ap ...