zoukankan      html  css  js  c++  java
  • [JZOJ 5819] 大逃杀

    题意:求一个树上背包~~
    先贴代码存一下,好像打挂了。

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 400;
    const int INF = 0x3c;
    int dp[maxn][maxn][3];
    
    inline int read() {
    	int q=0,f=1;char ch = getchar();
    	while(!isdigit(ch)){
    		if(ch=='-')f=-1;ch=getchar();
    	}
    	while(isdigit(ch)){
    		q=q*10+ch-'0';ch=getchar();
    	}
    	return q*f;
    }
    int cnt;
    int head[maxn << 1];
    int n,m,t;
    struct edge {
    	int to;
    	int nxt;
    	int w;
    }e[maxn << 1];
    int ans;
    inline void Add_edge(int u,int v,int w) {
    	e[++cnt].to = v;
    	e[cnt].nxt = head[u];
    	head[u] = cnt;
    	e[cnt].w = w;
    	e[++cnt].to = u;
    	e[cnt].nxt = head[v];
    	head[v] = cnt;
    	e[cnt].w = w;
    }
    int s[maxn];
    int cost[maxn];
    inline void dfs(int x,int fa) {
    	for(int i = 0;i <= t; ++i) {
    		if(i < s[x]) {
    			dp[x][i][0] = dp[x][i][1] = dp[x][i][2] = -INF;
    		}
    		else {
    			dp[x][i][0] = dp[x][i][1] = dp[x][i][2] = cost[x];
    		}
    	}
    	for(int i = head[x];i;i=e[i].nxt) {
    		int y = e[i].to;
    		if(y != fa) {
    			dfs(y,x);
    			for(int j = t;j >= e[i].w; --j) {
    				for(int k = 0;k <= j - e[i].w; ++k) {
    					if(j - k >= 2 * e[i].w) {
    						dp[x][j][2] = max(dp[x][j][2],dp[y][k][0] + dp[x][j - 2 * e[i].w - k][2]);
    					}
    					if(j - k >= 2 * e[i].w) dp[x][j][2] = max(dp[x][j][2],dp[y][k][2] + dp[x][j - k - 2 * e[i].w][0]);
    					dp[x][j][2] = max(dp[x][j][2],dp[y][k][1] + dp[x][j - k - e[i].w][1]);
    					if(j - k >= 2 * e[i].w) {
    						dp[x][j][1] = max(dp[x][j][1],dp[y][k][0] + dp[x][j - k - 2 * e[i].w][1]);
    					}
    					dp[x][j][1] = max(dp[x][j][1],dp[y][k][1] + dp[x][j - k - e[i].w][0]);
    					if(j - k >= 2 * e[i].w) {
    						dp[x][j][0] = max(dp[x][j][0],dp[y][k][0] + dp[x][j - k - 2 * e[i].w][0]);
    					}
    				}
    			}
    		}
    	}
    }
    int main () {
    	freopen("toyuq.in","r",stdin);
    	freopen("toyuq.out","w",stdout);
    	n = read(),t = read();
    	for(int i = 1;i <= n; ++i) {
    		cost[i] = read();
    	}
    	for(int i = 1;i <= n; ++i) {
    		s[i] = read();
    	}
    	for(int i = 1;i < n; ++i) {
    		int x = read(),y = read(),z = read();
    		Add_edge(x,y,z);
    	}
    	dfs(1,0);
    	for(int i = 1;i <= n; ++i) {
    		ans = max(ans,dp[i][t][2]);
    	}
    	printf("%d\n",ans);
    	return 0;
    }
    
  • 相关阅读:
    May 24th 2017 Week 21th Wednesday
    May 23rd 2017 Week 21st Tuesday
    全球顶尖大学的UX课程资源,英文!
    如何设计出一款出色的结账表单
    快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力
    界面设计中如何增强CTA按钮召唤力?
    10个实用的UX设计作品推销小窍门
    UX术语详解:任务流,用户流,流程图以及其它全新术语
    让你不再恋家的9款小众时尚的酒店网站设计
    聊聊原型设计中的团队管理功能
  • 原文地址:https://www.cnblogs.com/akoasm/p/9601238.html
Copyright © 2011-2022 走看看