luogu 3698 [CQOI2017]小Q的棋盘 树形dp
2024-09-05 08:06:34
Code:
#include <bits/stdc++.h>
#define N 107
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,K,f[N][N],g[N][N],tmp[N][N];
vector<int>G[N];
void add(int u,int v)
{
G[u].push_back(v);
}
void getmax(int &a,int b)
{
if(b>a) a=b;
}
void dfs(int u,int ff)
{
f[u][0]=tmp[u][0]=1;
for(int i=0;i<G[u].size();++i)
{
int v=G[u][i];
if(v==ff) continue;
dfs(v,u);
for(int j=K;j>=0;--j)
{
for(int d=0;d<=j;++d)
{
if(j-d-1>=0)
{
getmax(tmp[u][j], f[u][j-d-1]+g[v][d]); // 新走
}
if(j-d-2>=0) getmax(tmp[u][j],tmp[u][j-d-2]+f[v][d]); // 以前走过
}
}
for(int j=K;j>=0;--j)
{
for(int d=0;d<=j;++d)
if(j-d-2>=0) getmax(f[u][j], f[u][j-d-2]+f[v][d]);
}
}
for(int i=0;i<=K;++i) g[u][i]=tmp[u][i];
}
int main()
{
int i,j;
// setIO("input");
scanf("%d%d",&n,&K);
for(i=1;i<=n-1;++i)
{
int a,b;
scanf("%d%d",&a,&b),add(a+1,b+1),add(b+1,a+1);
}
dfs(1,0);
int ans=0;
for(i=1;i<=K;++i) getmax(ans, g[1][i]);
printf("%d\n",ans);
return 0;
}
最新文章
- android——相对布局,表格布局
- Java的各种工具类
- javascrpt 中的Ajax请求
- 解决32位plsql连接数据库的问题
- tcprstat源码分析之tcp数据包分析
- android webview 访问https页面 SslError 处理
- C#学习第六天
- Linux(Centos)之安装tomcat并且部署Java Web项目(转)
- 9_Permanent Storage
- POJ 3691 DNA repair 基于AC自己主动机DP
- android脚步---简单图片浏览器改变图像透明度
- JspContext对象与PageContext对象
- Webpack 速成
- JEESZ-kafka集群安装
- DDD实践
- keepalived--小白博客
- node+mongoose+vue
- windows下consul利用json文件注册服务
- C++ Primer 笔记——嵌套类 局部类
- Linux中使用Electronic WeChat客户端