zoukankan      html  css  js  c++  java
  • [HNOI/AHOI2018] 道路

    https://www.luogu.com.cn/problem/P4438

    这个神仙问题告诉我们,树形dp还是dp,动态规划是真的难,不会设转移方程要吃大亏

     写成记忆话搜索是真的方便,服了

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<vector>
    using namespace std;
    typedef long long ll;
    const int maxn = 22000;
    ll INF = 1e16;
    int n;
    
    //-----------------建立边部分
    
    ll dp[22000][44][44];
    ll a[22000], b[22000], c[22000];
    int son[22000][3];
    
    
    ll dfs(int x, int i, int j) {
    	if (x < 0) {
    		int xx = -x;
    		return 1LL*c[xx] * (a[xx] + i)*(b[xx] + j);
    	}
    	if (dp[x][i][j] < INF) return dp[x][i][j];
    
    	return dp[x][i][j] = min(dfs(son[x][0], i, j) + dfs(son[x][1], i, j + 1), dfs(son[x][0], i+1, j) + dfs(son[x][1], i, j));
    }
    
    int main() {
    	for (int i = 0; i < maxn; i++) {
    		for (int j = 0; j < 44; j++) {
    			for (int k = 0; k < 44; k++) {
    				dp[i][j][k] = INF;
    			}
    		}
    	}
    
    	scanf("%d", &n);
    	int be, en;
    	for (int i = 1; i < n; i++) {
    		scanf("%d%d", &be, &en);
    		son[i][0] = be;
    		son[i][1] = en;
    	}
    	for (int i = 1; i <= n; i++) {
    		scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
    	}
    	int root = 1;
    	ll ans = dfs(root, 0, 0);
    	cout << ans << endl;
    	return 0;
    }
    

      

    寻找真正的热爱
  • 相关阅读:
    Unity 小笔记
    UE4 Pure函数的特点
    C++ const总结
    配色问题lingo实现
    选址问题lingo求解
    迷宫问题python实现(靠右手摸墙)
    环形队列C++实现
    排队论的C实现
    递归实现全排列序列C语言实现
    双人贪吃蛇小游戏C++原创
  • 原文地址:https://www.cnblogs.com/lesning/p/12519526.html
Copyright © 2011-2022 走看看