POJ 2486 树形背包DP Apple Tree
2015-07-31 14:41
447 查看
设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果。
则有状态转移方程:
代码君
则有状态转移方程:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn = 100 + 10; const int maxk = 200 + 10; int n, k; int a[maxn]; int d[maxn][maxk][2]; vector<int> G[maxn]; void dfs(int u, int fa) { for(int i = 0; i < G[u].size(); i++) { int v = G[u][i]; if(v == fa) continue; dfs(v, u); for(int j = k; j >= 1; j--) for(int t = 1; t <= j; t++) { if(t > 1) d[u][j][0] = max(d[u][j][0], d[u][j-t][0] + d[v][t-2][0]); if(t > 1) d[u][j][1] = max(d[u][j][1], d[u][j-t][1] + d[v][t-2][0]); d[u][j][1] = max(d[u][j][1], d[u][j-t][0] + d[v][t-1][1]); } } } int main() { while(scanf("%d%d", &n, &k) == 2 && n) { for(int i = 1; i <= n; i++) G[i].clear(); memset(d, 0, sizeof(d)); for(int i = 1; i <= n; i++) { scanf("%d", a + i); for(int j = 0; j <= k; j++) d[i][j][0] = d[i][j][1] = a[i]; } for(int i = 1; i < n; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs(1, 0); printf("%d\n", max(d[1][k][0], d[1][k][1])); } return 0; }
代码君
相关文章推荐
- 我的Android进阶之旅------>FastJson的简介
- 解决swiper动态数据加载在移动端下左右滑动不好使?
- iOS文字转语音播放
- View层的组织和调用方案(中)
- ios客户端RSA公钥加密 .net后台私钥解密解决方案(基于Openssl)
- Android 基础控件之AutoCompleteTextView
- Object-C 四种创建临时字符串的方法
- android帧布局——霓虹灯
- android.support.design.widget.TabLayout
- iOS画线粗细
- WPF Freezable–How to improve your application's performances
- Android程序开始的等待动画或LOGO
- android_Activity的四种启动模式和onNewIntent()
- iOS--iOS7摄像头识别二维码功能
- [Objective-C] NSArray initWithObjects "Expression result unused" warning
- android sqlite操作(1)
- androidstudio使用笔记
- iOS 耳机的简单知识
- iOS 键盘弹出视图上移
- Android动画效果translate、scale、alpha、rotate详解