文章
68
粉丝
691
获赞
26
访问
578.3k
这道题确实很有意思,Category写个图论我想了半天网络流,最后还是从暴力入手,搜索变记忆化搜索来解决。
换句话说,从下到上进行遍历,我们避免了相同状态的多次遍历,得解
#define ll long long
#define inf 0x3f3f3f3f
#define MAX 100006
#define vec vector<int>
#define P pair<int,int>
#define MOD 100003
int N, a[MAX], dp[MAX][2], x, y, fa[MAX], r = 0;
vec G[MAX];
void memDfs(int v) {
if (G[v].size() == 0) {//他没有儿子
dp[v][0] = 0;//0是不选
dp[v][1] = a[v];//1是选
return;
}
for (int i = 0; i < G[v].size(); i++) {//便利他的每个儿子
int u = G[v][i];
memDfs(u);
dp[v][0] += max(dp[u][0], dp[u][1]); //不选v,那么他的儿子选/不选两种状态中选最好的
dp[v][1] += dp[u][0]; //选了v就不能选u
}
}
int main() {
while (cin >> N) {
for (int i = 1; i <= N; i++)cin >> a...
登录后发布评论
暂无评论,来抢沙发