又重构了一下。。。当然当初的题一看就看懂了QAQ


设f[i][j]表示以i为根的子树,有j个客户的最大收益

方程:f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]-w(u,v))  0<=j<=lastsize,0<=k<=v.size

#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
const int N=;
using namespace std;
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,cnt;
int vr[N*N],nxt[N*N],w[N*N],fir[N],a[N],f[N][N];
inline void add(int u,int v,int ww) {vr[++cnt]=v,w[cnt]=ww,nxt[cnt]=fir[u],fir[u]=cnt;}
inline int dfs(int u) {
if(u>n-m) {f[u][]=a[u]; return ;} R ret=;
for(R i=fir[u];i;i=nxt[i]) { R v=vr[i],sz=dfs(v),ww=w[i];
for(R j=ret;j>=;--j) for(R k=sz;k>=;--k)
f[u][j+k]=max(f[u][j+k],f[u][j]+f[v][k]-ww); ret+=sz;
} return ret;
}
signed main() {
n=g(),m=g(); memset(f,0xbf,sizeof(f));
for(R u=;u<=n-m;++u) { R sz=g();
for(R j=,v,w;j<=sz;++j) v=g(),w=g(),add(u,v,w);
} for(R i=n-m+;i<=n;++i) a[i]=g(); for(R i=;i<=n;++i) f[i][]=;
dfs(); for(R i=m;i;--i) if(f[][i]>=) {printf("%d\n",i); break;}
}

2019.04.28

最新文章

  1. 【干货分享】流程DEMO-外出申请
  2. service和serviceImpl的选择
  3. 使用AssetsLibrary.Framework创建多图片选择控制器(翻译)
  4. 使用ftp软件上传下载php文件时换行丢失bug
  5. 5种IO模型
  6. Hashmap in java
  7. jquery cookie 用法
  8. 关于webview嵌入swf
  9. js之parentElement属性
  10. 【边做项目边学Android】小白会遇到的问题--This Android SDK requires Android Developer Toolkit version 23.0.0 or above
  11. 开发人员应关注的20个jQuery网站/博客
  12. [原创作品] RequireJs入门进阶教程
  13. Xamarin.Android开发实践(四)
  14. mysql管理----状态参数释义
  15. Map的迭代
  16. 【linux之sed及vim】
  17. Python函数式编程之lambda表达式
  18. 初入 vue
  19. 【Python学习】yield send我就说这么多
  20. Using the G711 standard

热门文章

  1. php安装memcache
  2. cocos2d-x 在vs2010下的环境配置
  3. JAVA环境安装配置
  4. SQLite在php中的接口
  5. 实践作业3:白盒测试----小组分工讨论DAY2
  6. 验证码测试-demo
  7. linux新的API signalfd、timerfd、eventfd使用说明
  8. 日期多选插件Kalendae.js
  9. 合成(Composite)模式
  10. 《Andorid开源》greenDao 数据库orm框架