首页 > 其他分享 >Codeforces Round 978 (Div. 2) C. Gerrymandering 轮廓DP

Codeforces Round 978 (Div. 2) C. Gerrymandering 轮廓DP

时间:2024-10-15 23:15:11浏览次数:7  
标签:Gerrymandering int max Codeforces 978 ## DP dp

Codeforces Round 978 (Div. 2) C轮廓DP

C. Gerrymandering

思路:考虑有哪些情况呢?

image

发现结尾只有三种情况,0.平的1.上凸2.下凸。

那么每一种后面能出现什么呢?

image

这样看起来就好写啦。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
ll a[N],b[N];
ll dp[N][3];
 
 
 
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        for(int i = 1;i <= n; i++){
            char x; cin>>x;
            a[i] = (x=='A');
        }
        for(int i = 1;i <= n; i++){
            char x; cin>>x;
            b[i] = (x=='A');
        }
 
        memset(dp,128,sizeof(dp));
         
        dp[0][0] = 0;
 
        for(int i = 1;i <= n; i++)
        {
           if(i >= 3)
           {
                dp[i][0] = max(dp[i][0],dp[i-3][0]+((a[i]+a[i-1]+a[i-2])>=2)+((b[i]+b[i-1]+b[i-2])>=2));//###
                                                                                                        //###
 
                dp[i][1] = max(dp[i][1],dp[i-3][1]+((a[i]+a[i-1]+a[i-2])>=2)+((b[i-1]+b[i-2]+b[i-3])>=2));//.###
                                                                                                          //###.
 
                dp[i][2] = max(dp[i][2],dp[i-3][2]+((a[i-1]+a[i-2]+a[i-3])>=2)+((b[i]+b[i-1]+b[i-2])>=2));//###.
                                                                                                          //.###
           }
 
           if(i >= 2)
           {
                dp[i][1] = max(dp[i][1],dp[i-2][0]+((a[i]+a[i-1]+b[i-1])>=2));//##
                                                                              //#.
 
                dp[i][2] = max(dp[i][2],dp[i-2][0]+((a[i-1]+b[i]+b[i-1])>=2));//#.
                                                                              //##
           }
 
           dp[i][0] = max(dp[i][0],dp[i-1][2]+((a[i-1]+a[i]+b[i])>=2));//##
                                                                       //.#
 
           dp[i][0] = max(dp[i][0],dp[i-1][1]+((a[i]+b[i]+b[i-1])>=2));//.#
                                                                       //##
 
 
 
             
     }
      cout<<dp[n][0]<<"\n";
 
    }
    return 0;
}

标签:Gerrymandering,int,max,Codeforces,978,##,DP,dp
From: https://www.cnblogs.com/nannandbk/p/18468734

相关文章

  • 【做题记录】Codeforces Round 943 (Div. 3)/CF1968A-F
    【做题记录】CodeforcesRound943(Div.3)/CF1968A-FA暴力枚举即可。B双指针枚举即可,能匹配就匹配。C考虑构造出\(a[1]=1,a[i]=a[i-1]+x[i]\)的数列,发现满足要求。D有个明显的结论,两人最终一定是在某个点上的。于是从起点开始扫一遍,求出到每一个点的距离和路上的分数......
  • Solution - Codeforces 1628D2 Game on Sum (Hard Version)
    首先来考虑Easy。注意到的是最后输出的答案要求是模意义下的,这说明对于实数二分的做法都已经用不了了。注意到\(n,m\le3000\)的数据范围,于是一个想法就是考虑DP之类的算法。考虑到B选了\(+/-\)实际上就代表着下一轮的\(m\)是否会\(-1\),于是可以设状态为\(f_{i......
  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • Educational Codeforces Round 170 (Rated for Div. 2) D.Attribute Checks (没有完全
    算法显然为dp状态设计\(dp_{i,j}\)表示在第\(i\)个获得能力点的地方,之前智慧能力值为\(j\),时的最大分数状态转移显然需要从\(dp_{i-1,j}\)转移而来枚举\(j\in[0,i)\)则有(注意取\(\max\)操作要与自己相比较)设第\(i-1\)个能力点到第\(i\)个能......
  • # Educational Codeforces Round 170 (Rated for Div. 2) 题解D
    EducationalCodeforcesRound170(RatedforDiv.2)题解DD.AttributeChecks链接:Problem-D-Codeforces思路:由于\(m\)还有\(abs(r[i])\)很小,考虑dp因为每个0能对后面多少个check做出贡献是固定的,所以预处理因为我们每次的0的个数是单调不减的所以,我们上一次......
  • Educational Codeforces Round 170 (Rated for Div. 2) C. New Games
    题意转化找一些相邻的数(其中相邻定义为递增序下任意相邻两数差\(\leq1\))求相邻数中,不同数字有\(k\)种,取到数字个数的最大值算法容易想到按顺序排列观察到有点像滑动窗口,考虑用队列维护一个出现不同数字次数为\(k\)的区间,再计算代码来自转载地址voidsolv......
  • Codeforces Educational Codeforces Round 170 (Rated for Div. 2)
    A-TwoScreens大意:    给两个字符串,每次在两个空子符串进行两种操作     1、字符串末尾加一个任意字母    2、一个字符串全部复制给另一个字符串    求得到给定的两个字符串的最小操作数思路:    看最前面有多少相等即可 ......
  • Educational Codeforces Round 170 (Rated for Div. 2)
    目录写在前面A签到B结论C双指针D模拟,差分,DP,结论E计数,DP,F写在最后写在前面比赛地址:https://codeforces.com/contest/2025。妈的不想上学省赛回来昏了一天了。A签到发现最优的操作是先在一个屏幕操作得到最长公共前缀,然后复制到另一方上,再分别操作两方。特判若无公共前......
  • Codeforces Round 978 (Div. 2) A-D1 题解
    我的同学还在VP,排名马上放声明:不要觉得有subtask的题目只做Easyversion没有意义,从这里也能捞很多分,况且有的时候并不是简单和难的区别,而是考不同的算法A.BustoPénjamo题意有一辆车上面有$r$排座位,每排有$2$个座位,现在共$n$个家庭出行坐公交车,每个家庭$a_i$......
  • codeforces round 977 (div.2) C2(访问set的第一个元素,观察数据规律-出现次序,用set记
    解题历程:我首先想到的是等效法,每一次操作可以等效为每次将第一个人抽出放入一组,后面的人往前移,而该组的人就是可以任意放置的人,当b中后面再出现与前一个相同的人时,就不进行操作,当b中出现不同的人时,就看看这组中有没有这个人,有的话就下一个循环,没有的话就看看这个新的人是否按a中......