首页 > 其他分享 >Letter Picking (CF D) (区间DP, 暴力)(0,1,2 Alice 平 bob ,尽可能小,尽可能大)

Letter Picking (CF D) (区间DP, 暴力)(0,1,2 Alice 平 bob ,尽可能小,尽可能大)

时间:2023-10-05 16:11:48浏览次数:43  
标签:int CF Alice 尽可能 bob DP alice

 思路 :

  • 区间dp(区间DP的时间复杂度 不一定是 n^3 ,可能是 n^2 更具题意)
  • 直接题 直接 区间dp, 0 Alice 赢 1 平局 2 Bob 赢 (于是 alice 尽可能小, bob 尽可能大)
  • alice 选 l , bob 可以选 l+1, 或者 r
  • alice 选 r , bob 可选 l 或者 r-1,

看代码就行了

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
const int mod=1e9+7;
#define inf 1e9
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    return x*f;
}
string s;
const int N=2e3+5;
int T,n,m,dp[N][N];
inline int make(int op,int p1,int p2){
    if(op!=1)return op;
    return (s[p1]<s[p2]?0:(s[p1]==s[p2]?1:2));
}
int main(){
    T=read();
    while(T--){
        cin>>s;n=s.size();s=" "+s;
        for(int i=1;i<=n;i++)
            for(int j=i;j<=n;j++)dp[i][j]=3;
        for(int len=2;len<=n;len+=2)
            for(int l=1;l+len-1<=n;l++){
                int r=l+len-1;
                if(len==2){dp[l][r]=(s[l]==s[r]);continue;}
                int res=2;
                res=min(res,max(make(dp[l+1][r-1],l,r),make(dp[l+2][r],l,l+1)));
                res=min(res,max(make(dp[l+1][r-1],r,l),make(dp[l][r-2],r,r-1)));
                dp[l][r]=res;
            }
        if(dp[1][n]==0)puts("Alice");
        else if(dp[1][n]==1)puts("Draw");
        else puts("Bob");
    }
    return 0;
}
View Code

后记:

  • 有时候 直接暴力硬做就行了, 不用想性质, 或者说 暴力本身就是一种性质, 在数据范围小的时候,  

标签:int,CF,Alice,尽可能,bob,DP,alice
From: https://www.cnblogs.com/Lamboofhome/p/17743465.html

相关文章

  • Luogu CF1174C 题解
    这道题其实不难。\(\gcd(i,j)=1\),其实就是\(i\)与\(j\)互质。如果\(i\)与\(j\)不互质,那么我们一定要让\(a_i\)与\(a_j\)相同,只有这样,才能使\(a\)序列中的最大值最小化。所以,我们可以使用埃氏筛法,当筛到质数时,给它和它的倍数都赋值为一个新数。ACCode:#include......
  • Luogu CF1469B 题解
    这道题其实并不难。题目大意是这样的:已知两个序列\(r\)和\(b\),求出合并后的最大前缀和。很好发现:答案就是\(r\)和\(b\)各自的最大前缀和之和。但要注意:\(r\)和\(b\)可以什么都不取,因此\(maxa\)和\(maxb\)初始要赋值为\(0\)。ACCode:#include<iostream>using......
  • Luogu CF755B 题解
    这题其实不难。两人最佳的方案就是先说对方会的词。不难证明,设先手会说\(n\)个单词,后手会说\(m\)个单词,若\(n>m\),则先手胜,若\(n<m\),则后手胜。那如果\(n=m\)呢?假设两人都会说的单词数为\(k\),那么一番推理发现,当两人说了\(k-1\)次,就没有两人都会的词了,可以回到之......
  • Luogu CF1133B 题解
    这道题其实很简单要让两数和为\(k\)的倍数,需要满足以下两条件之一:两数都是\(k\)的倍数两数的余数和为\(k\)因此,我们可以先统计出余数再按上述条件算出共有多少组,即可得到答案注意:当\(k\)为偶数时,余数为\(k/2\)的数要两两配对,不要多算这里统计的是组数,......
  • Luogu CF400C 题解
    这道题其实不难,只是一道非常简单的模拟题。我们发现,每顺时针转动\(4\)次、镜面对称\(2\)次、逆时针旋转\(4\)次,就变回原来的样子了。所以,在操作前,我们可以让\(x\getsx\bmod4\),\(y\getsy\bmod2\),\(z\getsz\bmod4\)。接下来,只需在草稿纸上画一画,即可知道顺时针转一次,一......
  • CF163D
    爆搜题。由题列出以下方程组:\[\begin{cases}abc=V\\\frac{S}{2}=ab+bc+ac\end{cases}\]化简得:\[\frac{S}{2}=a(b+c)+\frac{V}{a}\]又由基本不等式\(a+b\geq2\sqrt{ab}\)得:\[\frac{S}{2}\geq2a\sqrt{bc}+\frac{V}{a}\\......
  • [题解] CF474E Pillars
    题意给定长度为\(n\)的序列\(a\)和常数\(d\),输出一个最长的\(a\)的子序列,使得相邻两项的差的绝对值大于等于\(d\)。\(n\le10^5\)题解数据结构优化DP的板子题了吧。首先,这道题看上去就很LIS,我们尝试着用类似LIS的思路去做。设\(f_i\)表示以\(i\)结尾的符合......
  • [CF1874D] Jellyfish and Miku
    JellyfishandMikuD<C<B,哈哈。设\(dp_i\)为起点为i时的期望步数,则\[dp_0=1+dp_1\\dp_n=0\\dp_i=1+\frac{a_{i-1}}{a_{i-1}+a_i}dp_{i-1}+\frac{a_{i-1}}{a_{i-1}+a_i}dp_{i+1}\]化简第三个式子可得\[a_{i+1}(dp_i-dp_{i+1})=a_i(dp_{i-1}-dp_i)+a_i+a_{i+1}\]设\(......
  • [CF1854E] Game Bundles
    题目描述Rishiisdevelopinggamesinthe2Dmetaverseandwantstooffergamebundlestohiscustomers.Eachgamehasanassociatedenjoymentvalue.Agamebundleconsistsofasubsetofgameswhosetotalenjoymentvalueaddsupto$60$.Yourtaskistoc......
  • Madoka and The Best University (cf E)( 枚举一个其中一个元素,欧拉函数,gcd)
    #include<iostream>#include<cstring>usingnamespacestd;constintMaxn=1e7;intphi[Maxn];//记录数的约数个数(欧拉函数)boolvis[Maxn];//记录数字是否访问intprime[Maxn];//保存素数intmain(){memset(vis,false,sizeof(vis));memset(phi,0,sizeof(......