codevs P1421 秋静叶&秋穣子

127 篇文章 0 订阅
2 篇文章 0 订阅

题目大意:

在幻想乡,秋姐妹决定比比谁能够收集到最多的红叶。静叶将红叶分成了N堆(编号1..N),并且规定了它们的选取顺序,刚好形成一颗有向树。在游戏过程中,两人从根节点开始,轮流取走红叶,当一个人取走节点i的红叶后,另一个人只能从节点i的儿子节点中选取一个。当取到某个叶子时游戏结束,然后两人会比较自己得到的红叶数量。已知两人采用的策略不一样,静叶考虑在让穰子取得尽可能少的前提下,自己取的最多;而穰子想得是在自己尽可能取得多的前提下,让静叶取得最少。在两人都采取最优策略的情况下,请你计算出游戏结束时两人的红叶数量。
  游戏总是静叶先取,保证只存在一组解。
  
数据范围
  对于30%的数据:1 ≤ N ≤ 100,1 ≤ num[i] ≤ 100
  对于60%的数据:1 ≤ N ≤ 10,000,1 ≤ num[i] ≤ 10,000
  对于100%的数据:1 ≤ N ≤ 100,000,1 ≤ num[i] ≤ 10,000
  注意:
  保证两人得到的红叶数在[0, 2^31-1]。

题解:

树上DP+博弈:
设f[i][0]表示以i为根的子树先手最优值,f[i][1]相应表示后手最优值,注意这里是先手跟后手,不是固定的静叶跟穰子。

当静叶是先手,穰子是后手,儿子为k:
你要使得f[k,0]最小的时候f[k,1]最大
f[i][0]=f[k][1]+num[i]

当穰子是先手,静叶是后手,儿子为k:
你要使得f[k,1]最大的时候f[k,0]最小
f[i][0]=f[k][1]+num[i]

这样的dp其实很容易实现,
虽然直接dfs可能会炸,但手工栈或从叶子节点逆着广搜推子节点就可以了。
codevs dfs竟然过了。。

代码:

var
     next,list,a,x,y:array [0..100001] of longint;
     f:array [0..100001,0..1] of longint;
     b:array [0..100001] of boolean;
     i,j,k,n,m:longint;

function max(aa,bb:longint):longint;
begin
     if aa>bb then exit(aa);
     exit(bb);
end;

procedure dfs(dep,rp:longint);
var
     i,j,k,op,cp:longint;
begin
     cp:=maxlongint;
     op:=0;
     k:=0;
     if dep=1 then
        begin
              j:=list[rp];
              while j>0 do
               begin
                    dfs(0,y[j]);
                    if (f[y[j],0]>op) or ((f[y[j],0]=op) and (f[y[j],1]<cp))
                       then begin
                                  op:=f[y[j],0];
                                  cp:=f[y[j],1];
                                  k:=y[j];
                            end;
                    j:=next[j];
               end;
        end
     else begin
              j:=list[rp];
              while j>0 do
              begin
                    dfs(1,y[j]);
                    if (f[y[j],1]<cp) or ((f[y[j],1]=cp) and (f[y[j],0]>op))
                       then begin
                                  op:=f[y[j],0];
                                  cp:=f[y[j],1];
                                  k:=y[j];
                            end;
                    j:=next[j];
              end;
          end;
     f[rp,0]:=f[k,1]+a[rp];
     f[rp,1]:=f[k,0];
end;

begin
   readln(n);
     for i:=1 to n do read(a[i]);
       for i:=1 to n-1 do
         begin
              readln(x[i],y[i]);
              next[i]:=list[x[i]];
              list[x[i]]:=i;
              b[y[i]]:=true;
         end;
     for i:=1 to n do
        if not(b[i]) then k:=i;
     dfs(1,k);
     writeln(f[k,0],' ',f[k,1]);
end.
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值