zoukankan      html  css  js  c++  java
  • Codeforces Round #380 Div.2 F

    F - Financiers Game

    这种两人博弈一般都可以用两个dp写, 一个dp描述第一个人的最优态, 第二个dp描述第二个人的最优态,难点在于优化空间。。。

    我感觉这个空间开得有点玄学。。

    dp[ op ][ l ] [ d ] [ k ] 表示到第op个人先手,在第任意轮的时候第一个人和第二个人取的个数只差不会超过180,所以用他们的差值开一维状态。

    d = (l - 1) - (n - r), 只有区间 (l , n + d - l - 1)的情况下的最优值。

     1 #include<bits/stdc++.h>
     2 #define LL long long
     3 #define mk make_pair
     4 using namespace std;
     5 
     6 const int N = 2e3 + 50;
     7 const int inf = 0x3f3f3f3f;
     8 int B = 95, n;
     9 int dp[2][N][180][180], a[N];
    10 
    11 int dfs(int l, int r, int k, int op) {
    12     int d = (l - 1) - (n - r);
    13     int &ans = dp[op][l][B + d][k];
    14     if(ans != -1) return ans;
    15     int ret;
    16     if(op == 0) {
    17         if(l + k - 1 == r) return dp[op][l][B + d][k] = a[r] - a[l - 1];
    18         else if(l + k - 1 > r)  return dp[op][l][B + d][k] = 0;
    19         
    20         int ret1 = dfs(l + k, r, k, op ^ 1) + a[l + k -1] - a[l - 1];
    21         int ret2 = dfs(l + k + 1, r, k + 1, op ^ 1) + a[l + k] - a[l - 1];
    22         ret = max(ret1, ret2);
    23     } else {
    24         if(l + k - 1 == r) return dp[op][l][B + d][k] = -a[r] + a[l - 1];
    25         else if(l + k - 1 > r)  return dp[op][l][B + d][k] = 0;
    26         
    27         int ret1 = dfs(l, r - k, k, op ^ 1) - a[r] + a[r - k];
    28         int ret2 = dfs(l, r - k - 1, k + 1, op ^ 1) - a[r] + a[r - k - 1];
    29         ret = min(ret1, ret2);
    30     }
    31     return dp[op][l][d + B][k] = ret;
    32 }
    33 int main() {
    34     memset(dp, -1, sizeof(dp));
    35     scanf("%d", &n);
    36     for(int i = 1; i <= n; i++)
    37         scanf("%d", &a[i]), a[i] += a[i - 1];
    38     int ans = dfs(1, n, 1, 0);
    39     printf("%d
    ", ans);
    40     return 0;
    41 }
    42 /*
    43 */
  • 相关阅读:
    收集最好的Mac软件和使用方法
    为什么使用Binder而不是其他IPC机制
    Android什么时候进行View中Background的加载
    Android属性动画源代码解析(超详细)
    JMockit工具总结
    路由器和交换机的区别
    6种 @Transactional 注解失效场景
    20个使用 Java CompletableFuture的例子
    书写高质量SQL的30条建议
    Netty之什么是 TCP 拆、粘包?如何解决?
  • 原文地址:https://www.cnblogs.com/CJLHY/p/8858072.html
Copyright © 2011-2022 走看看