• HDU 4111 Alice and Bob


    好题。搜的题解敲的,没什么好多说的。但是还是想说两点:

    1.本来一直不理解为什么这种博弈的问题可以用DP去做,因为双方都采用最优策略的情况下,不知道他会如何选择,但是今天明白了,这种博弈问题,对于给定的一个状态,其结果就已经是确定了的。因此可以由一个最初的确定的状态搜出所有的其他状态。另外,这里的dp数组只要赋值一次就可以了,因为不管输入的数据怎么变,给定的状态的结果是不会变的。

    2.能在现场赛中做出这种难度的DP,是我的目标,当然,这还需要很多的努力和练习。毕竟就算这道题告诉我是DP了,我也不知道怎么设计状态。还有好几个容易出问题的小细节我都出问题了。差距还是很大的。

     1 #include <cstdio>
     2 #include <cstring>
     3 int d[55][55000];
     4 int dp(int i,int j){
     5     int &ans = d[i][j];
     6     if(ans != -1)   return ans;
     7     if(j == 1)  return ans = dp(i+1,0);
     8     ans = 0;
     9     if(i >= 1 && !dp(i-1,j))    ans = 1;
    10     if(i >= 1 && j && !dp(i-1,j+1))  ans = 1;
    11     if(i >= 2 && ((j && !dp(i-2,j+3)) || (!j && !dp(i-2,2))))   ans = 1;
    12     if(j >= 2 && !dp(i,j-1))    ans = 1;
    13     return ans;
    14 }
    15 int main(){
    16     int t,n;
    17     scanf("%d",&t);
    18     memset(d,-1,sizeof(d));
    19     for(int kase = 1;kase <= t;kase++){
    20         //memset(d,-1,sizeof(d));
    21         int a = 0,b = 0,tmp;
    22         scanf("%d",&n);
    23         for(int i = 0;i < n;i++){
    24             scanf("%d",&tmp);
    25             if(tmp == 1)    a++;
    26             else b += (tmp+1);
    27         }
    28         if(b)   b--;
    29         //printf("a = %d,b = %d
    ",a,b);
    30         if(dp(a,b)){
    31             printf("Case #%d: Alice
    ",kase);
    32         }else{
    33             printf("Case #%d: Bob
    ",kase);
    34         }
    35     }
    36     return 0;
    37 }
    View Code
  • 相关阅读:
    p1373【奶牛的卧室】
    p1248【交错匹配】(DP)
    QBXT模拟赛T3
    NOIP冲刺班的考试总结
    欧拉回路的一些东西
    一道dp题目
    Blocks
    玩具取名
    Y的积木
    游荡的奶牛
  • 原文地址:https://www.cnblogs.com/zhexipinnong/p/3415065.html
Copyright © 2020-2023  润新知