zoukankan      html  css  js  c++  java
  • bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]

    4813: [Cqoi2017]小Q的棋盘

    题意:


    某poj弱化版?树形背包

    据说还可以贪心...

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int N = 105;
    inline int read() {
        char c=getchar(); int x=0,f=1;
        while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
        while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
        return x*f;
    }
    
    int n, m;
    struct edge{int v, ne;} e[N<<1];
    int cnt, h[N];
    inline void ins(int u, int v) {
    	e[++cnt] = (edge){v, h[u]}; h[u] = cnt;
    	e[++cnt] = (edge){u, h[v]}; h[v] = cnt;
    }
    int f[N][N][2];
    void dfs(int u, int fa) {
    	for(int i=0; i<=m; i++) f[u][i][0] = f[u][i][1] = 1;
    	for(int i=h[u]; i; i=e[i].ne) {
    		int v = e[i].v;
    		if(v == fa) continue;
    		dfs(v, u);
    		for(int j=m; j>=0; j--)
    			for(int k=1; k<=j; k++) {
    				if(k >= 1) f[u][j][0] = max(f[u][j][0], f[u][j-k][1] + f[v][k-1][0]);
    				if(k >= 2) {
    					f[u][j][1] = max(f[u][j][1], f[u][j-k][1] + f[v][k-2][1]);
    					f[u][j][0] = max(f[u][j][0], f[u][j-k][0] + f[v][k-2][1]);
    				}
    			}
    	}
    }
    
    int main() {
    	freopen("in", "r", stdin);
    	n=read(); m=read();
    	for(int i=1; i<n; i++) ins(read()+1, read()+1);
    	dfs(1, 0);
    	printf("%d
    ", f[1][m][0]);
    }
    
    
  • 相关阅读:
    linux相关的常用站点
    基于命令行的网络调试和测试工具
    清除DNS缓存
    数组映射
    react-native 自定义多选
    weex 长按图片保存
    MySql常用总结
    git常用命令
    react-native 自制多选功能
    react-native setState无法保持更新
  • 原文地址:https://www.cnblogs.com/candy99/p/6761674.html
Copyright © 2011-2022 走看看