bzoj 4254 树形dp
来源:互联网 发布:烟台华商网络怎么样 编辑:程序博客网 时间:2024/04/30 01:42
题意:给n个点,第i个点坐标(xi,yi),保证
每个点最多向右连出一条边。两条边的位置关系只可能是包含或没有交集。
那么这就是很多棵树。
建出树,树形dp,设
将k一维求一个前缀最大值,转移:
最后用
如果i,j都枚举到size那么复杂度可以降为
#include <bits/stdc++.h>using namespace std;#define N 210int n,m,K,top,Case;int X[N],Y[N],st[N],pos[N],fa[N],len[N],size[N];int f[N][N][11],t[N];vector<int>vec[N];void dfs(int x){ for(int i=0;i<=K;i++)f[x][0][i]=0; size[x]=1; for(int i=0,u;i<vec[x].size();i++) { dfs(u=vec[x][i]); size[x]+=size[u]; for(int j=min(m,size[x]);j>=0;j--) for(int k=0;k<=K;k++) for(int t=0;t<=size[u]&&t<=j;t++) { if(f[x][j-t][k]!=-1&&f[u][t][k]!=-1) f[x][j][k]=max(f[x][j][k],f[u][t][k]+f[x][j-t][k]); } } for(int i=min(m,size[x])-1;i>=0;i--) for(int j=0;j<K;j++) if(f[x][i][j]!=-1) f[x][i+1][j+1]=max(f[x][i+1][j+1],f[x][i][j]+len[x]); for(int i=1;i<=K;i++) for(int j=0;j<=m&&j<=size[x];j++) f[x][j][i]=max(f[x][j][i],f[x][j][i-1]);}int main(){ //freopen("tt.in","r",stdin); while(scanf("%d%d%d",&n,&m,&K)!=EOF) { K--; memset(f,-1,sizeof(f)); memset(t,-1,sizeof(t)); memset(size,0,sizeof(size)); for(int i=1;i<=n;i++) scanf("%d%d",&X[i],&Y[i]); top=0; for(int i=1;i<=n;i++) { pos[i]=fa[i]=0; vec[i].clear(); } for(int i=1;i<=n;i++) { while(Y[i]>Y[st[top]]&&top)top--; if(Y[i]==Y[st[top]]&&top) { pos[st[top]]=i; len[st[top]]=X[i]-X[st[top]]; top--; } st[++top]=i; } for(int i=1;i<=n;i++) if(pos[i]) { int p=0; for(int j=1;j<i;j++) if(pos[j]&&X[pos[j]]>X[pos[i]])p=j; if(p)vec[p].push_back(i); fa[i]=p; } t[0]=0; for(int i=1;i<=n;i++) if(!fa[i]&&pos[i]) { dfs(i); for(int j=m;j>=0;j--) for(int k=0;k<=size[i]&&k<=j;k++) if(t[j-k]!=-1&&f[i][k][K]!=-1) t[j]=max(t[j],t[j-k]+f[i][k][K]); } printf("Case %d: %d\n",++Case,t[m]); } return 0;}
0 0
- bzoj 4254 树形dp
- BZOJ 2152 (树形DP)
- bzoj 3037(树形DP)
- bzoj 4027 树形dp
- bzoj 3573(树形DP)
- BZOJ 1369 树形DP
- BZOJ 4033 树形DP
- BZOJ 3037 创世纪 树形DP
- BZOJ 3004 吊灯 树形DP
- bzoj 1040(树形DP)
- bzoj 2060(树形DP)
- bzoj 1060(贪心+树形DP)
- 【BZOJ 3037】 创世纪 树形DP
- BZOJ 3037 创世纪 树形DP
- bzoj 1907(树形dp)
- bzoj 1060(树形dp)
- bzoj 1131(树形dp)
- bzoj 1369(树形dp)
- 《从零开始学Swift》学习笔记(Day 15)——请注意数字类型之间的转换
- PHP中include和require的区别详解
- 自定义日历的时间选着
- Angularjs filter过滤器以及自定义filter过滤器
- Gson 优雅实现多个枚举的自定义(反)序列化过程
- bzoj 4254 树形dp
- Sequelize和MySQL对照 【翻译】
- 题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树
- 23、H5新增js属性之本地存储
- 对java的Hash方法的一些分析总结
- WebDriver参考资料
- 根据前序遍历中序遍历求二叉树
- VM12中CentOS7以NAT的方式连接网络
- CSS之visibility和display的差别