首页 > 其他分享 >思维题做题记录

思维题做题记录

时间:2022-09-20 19:58:04浏览次数:84  
标签:思维 记录 int 2001 做题 tmp4 min1 min2 tmp3

博弈论-CF1728D

先明确一些事情:

  • 对于 str[l, r], 若 A 先手,最后的结果是确定的。(这里的字符串长度为偶数)

现在,我们设 \(f_{l, r}\) 表示对于字符串 [l, r], A 先手的博弈结果。最后要输出的答案则是 \(f_{1, n}\).
我们考虑 \(f_{l, r}\) 怎么用已求出来的小区间答案推出来(也可以说是他的转移方程):

A 先手,A 在决策时会这么想:(下面的 1 代表选首位,2 代表选末尾)
假设 A 选 1:B 选 1 时游戏结果是 tmp1, B 选 2 时游戏结果是 tmp2. B 一定会选 tmp1tmp2 中对他有利的一个(对 B 来说,优先级是 赢 > 平局 > 输,这里我们简记 min1 为对 B 来说有利的那一个),所以在 A 选 1 的情况下,最后的游戏结果是 min1.
假设 A 选 2:同上面一样的分析,设 A 选 2 时,最后的游戏结果为 min2.
综上,\(f_{l, r}\) 为 min1min2 中对 A 有利的一个。

点击查看代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int t;
char a[2001];
int k[2001][2001];//[l, r]: A先手, 游戏最后结果

int main(){
    scanf("%d", &t);
    while(t--){
        scanf("%s", a);
        int len = strlen(a);
        for(int i = 0; i < 2001; i++){
            memset(k[i], 0, sizeof(k[i]));
        }
        for(int i = 2; i <= len; i+=2){
            for(int j = 0; j + i - 1 < len; j++){
                //k[j][j + i - 1]
                if(i == 2){
                    if(a[j] == a[j + 1]) k[j][j + 1] = 0;
                    else k[j][j + 1] = 1;
                }
                else{
                    //1, 1
                    int tmp1 = 2;
                    if(k[j + 2][j + i - 1] == 0){
                        if(a[j] < a[j + 1]) tmp1 = 1;
                        if(a[j] == a[j + 1]) tmp1 = 0;
                    }
                    if(k[j + 2][j + i - 1] == 1){
                        tmp1 = 1;
                    }
                    //1, 2
                    int tmp2 = 2;
                    if(k[j + 1][j + i - 2] == 0){
                        if(a[j] < a[j + i - 1]) tmp2 = 1;
                        if(a[j] == a[j + i - 1]) tmp2 = 0;
                    }
                    if(k[j + 1][j + i - 2] == 1){
                        tmp2 = 1;
                    }
                    //2, 1
                    int tmp3 = 2;
                    if(k[j + 1][j + i - 2] == 0){
                        if(a[j] > a[j + i - 1]) tmp3 = 1;
                        if(a[j] == a[j + i - 1]) tmp3 = 0;
                    }
                    if(k[j + 1][j + i - 2] == 1){
                        tmp3 = 1;
                    }
                    //2, 2
                    int tmp4 = 2;
                    if(k[j][j + i - 3] == 0){
                        if(a[j + i - 1] < a[j + i - 2]) tmp4 = 1;
                        if(a[j + i - 1] == a[j + i - 2]) tmp4 = 0;
                    }
                    if(k[j][j + i - 3] == 1){
                        tmp4 = 1;
                    }

                    int min1, min2;
                    //1:
                    if(tmp1 == 1 && tmp2 == 1) min1 = 1;
                    else min1 = 0;
                    //2:
                    if(tmp3 == 1 && tmp4 == 1) min2 = 1;
                    else min2 = 0;
                    
                    if(min1 == 0 && min2 == 0) k[j][j + i - 1] = 0;
                    else k[j][j + i - 1] = 1;
                }
            }
        }

        if(k[0][len - 1] == 0) cout << "Draw" << endl;
        else cout << "Alice" << endl;
    }


    return 0;
}

标签:思维,记录,int,2001,做题,tmp4,min1,min2,tmp3
From: https://www.cnblogs.com/Jiayn/p/16712209.html

相关文章

  • 前端基础知识-css(一)个人学习记录
    待补充flex及其属性https://blog.csdn.net/weixin_44706267/article/details/121291934css3新特性sass和lesshttps://www.cnblogs.com/dasusu/p/10114097.html......
  • 做题记录整理dp3 P1108. 低价购买(2022/9/20)
    P1108.低价购买第一问很明显是一个最长下降子序列第二问就是一个求方案数,有点难想的就是去重感觉这题难度标的有点偏高#include<bits/stdc++.h>#definefor1(i,a,b)......
  • 批判性思维-概念、判断、推理和证明的关系
    01.一旦提到“关系”二字,一定是两个或两个以上的事物之间的关联状态。好比,只有提到“张三”和“李四”两个人时,才能讲关系——可能是兄弟、仇人,或其他什么关系。至于关......
  • 做题记录整理dp1 P1282. 多米诺骨牌(2022/9/20)
    P1282.多米诺骨牌我们可以把每张骨牌的差值塞进dp的维度了,就变成dpi,j表示前i块骨牌的差值为j的最小旋转次数就可以有递推方程dp[i,j]=max(dp[i-1,j-(a[i]-b[i])],dp[i......
  • 做题记录整理dp1 P1541. [NOIP2010 提高组] 乌龟棋(2022/9/20)
    P1541.[NOIP2010提高组]乌龟棋把每个牌选多少个塞进dp的四个维度里,就可以做到无后效性了#include<bits/stdc++.h>usingnamespacestd;#definefor1(i,a,b)for(ll......
  • D8加密狗的使用过程记录
    1、安装VSCode,并且安装插件   2、打开商家给提供的文件夹【打开的是整个文件夹】如下: 打开后效果如下: 3、编写加密锁里的逻辑打......
  • 做题记录整理线段树2 P4513. 小白逛公园(2022/9/20)
    P4513.小白逛公园我们思考一个如何使用线段树维护这个答案,会发现l.r的答案=max(l,mid的答案,mid+1,r的答案,横跨两个区间的答案)那么我们现在再引入一个区间的最大前缀......
  • 每日记录
    很急,很急,逃了很多课,却没刷几道题,很急,急死了,拖后腿就是我了,急急急急急急!!!2022年9月昨晚Div2看漏条件,演了半天.逃了线代和选修,然后tm的去学线代速......
  • 9.20Leetcode记录
    一、字符串的排列题干:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s="abc"输出:["abc","a......
  • BPMN2.0 规范学习记录
    BPMN2.0(BusinessProcessModelingNotation2.0,译为:业务流程模型注解Version2.0)是业务流程模型的一种标准注解,这个标准是由OMG(ObjecgtManagementGroup,译为:对象管理组织......