POJ 1949Chores(树形dp)

来源:互联网 发布:shift js按键 编辑:程序博客网 时间:2024/05/22 01:38

想来想去不知道怎么用拓扑,然后dp过了。

树形dp挺简单的,就是父节点完成的时刻是该节点所有的子节点完成时刻中的最大值加上父节点完成需要的时间(注意一下时刻跟时间)。然后一次水过去了。

#pragma warning(disable:4996)#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int N = 10005;vector<int>g[N];int cnt[N], cost[N], n;int ok[N];void dfs(int u) {if (ok[u] != -1)return;if (cnt[u] == 0) {ok[u] = cost[u];return;}int tmp = 0;for (int i = 0; i < (int)g[u].size(); i++) {dfs(g[u][i]);tmp = max(tmp, ok[g[u][i]]);}ok[u] = tmp + cost[u];}int main() {//freopen("in.txt", "r", stdin);scanf("%d", &n);for (int i = 1; i <= n; i++) {int x;scanf("%d %d", cost + i, &x);cnt[i] = x;while (x--) {int v; scanf("%d", &v);g[i].push_back(v);}}int ans = 0;memset(ok, -1, sizeof ok);for (int i = n; i > 0; i--) {if (ok[i] == -1)dfs(i);ans = max(ans, ok[i]);}printf("%d\n", ans);return 0;}


0 0