首页 > 其他分享 >cf-1767C-Count Binary Strings(区间dp)

cf-1767C-Count Binary Strings(区间dp)

时间:2022-12-31 12:56:25浏览次数:62  
标签:Count Binary arr int cf 110 断点 dp define

题面 https://codeforces.com/problemset/problem/1767/C

下面展示带注释的ac代码 在代码里解释思路

Ac代码
#include<bits/stdc++.h>
#define io ios::sync_with_stdio(false);
#define off cin.tie(0), cout.tie(0);
#define int long long
using namespace std;

const int mod = 998244353;
int t = 1, n, m, x, k;
int dp[110][110], arr[110][110];
// dp[i][j]->i之前的第一个断点在j后(i前的最右断点在 j 和 j+1 之间)

void run() {
    cin >> n;
    for (int i = 1; i <= n; i++) for (int j = i; j <= n; j++) cin >> arr[i][j];
    if (arr[1][1] != 2) dp[1][0] = 2;   // 若合法 则第一位之前没有断点时有 0,1 两种情况
    for (int pos = 1; pos <= n; pos++) {                // 枚举位置 1~n
        for (int gap = 0; gap < pos; gap++) {           // 枚举 i之前最后断点 0~pos-1 (断点在0代表i之前没有断点)
            int flag = 1;
            for (int now = 1; now <= gap; now++)        // 枚举从1到断点的所有位置 这段区间出现1的话代表[now,pos]内全相同 即和有断点矛盾 
                if (arr[now][pos] == 1) 
                    flag = 0;
            for (int now = gap + 1; now <= pos; now++)  // 枚举从断点到i的所有位置 这段区间出现2的话代表[now,pos]内不是全相同的 即和没有断点矛盾
                if (arr[now][pos] == 2) 
                    flag = 0;
            if (flag == 0)      // 断点在此不成立
                dp[pos][gap] = 0;
            dp[pos + 1][gap] = dp[pos][gap];            // 即断点不变 pos的增加只会使得后面相同的数字更长 方案数不变
            dp[pos + 1][pos] = (dp[pos + 1][pos] + dp[pos][gap]) % mod;     // 即确定了pos位与pos-1位不同 问有几种方案
        }
    }
    int ans = 0;
    for (int i = 0; i < n; i++)         // 枚举所有最后断点的方案数相加
        ans = (ans + dp[n][i]) % mod;   
    cout << ans << '\n';
}

signed main () {
    io off
    run();
}

标签:Count,Binary,arr,int,cf,110,断点,dp,define
From: https://www.cnblogs.com/Wint-x19/p/17016465.html

相关文章

  • E. Cross Swapping-带权并查集cf1713
    E.CrossSwappinghttps://codeforces.ml/problemset/problem/1713/E题意给定n*n的矩阵每次可以选定第k行和第k列交换位置操作次数不限求最小字典序的矩阵思路让......
  • CF1383E Strange Operation
    CF1383EStrangeOperation好题啊!!观察一下这个操作的本质:每次选择相邻两个位置,如果有0会直接消掉一个0,否则消掉一个1。这启发我们根据1的数量来做题。如果把相邻......
  • 题解 CF1770B【Koxia and Permutation】
    \(k=1\)的情况是平凡的。\(k>1\)的情况,显然答案至少为\(n+1\),下面给出构造证明\(n+1\)总可以取到。可以构造\(p=[n,1,n-1,2,n-2,3,\cdots]\),此时以\(n\)作为最......
  • 题解 CF1770C【Koxia and Number Theory】
    显然,如果存在\(a_i=a_j\),则一定无解。否则,考虑每一个\(2\sim50\)的正整数\(k\),如果原数组每个数对\(k\)取模后,每种余数都出现至少两次,则无解。因为此时无论如何选......
  • CountDownLatch和CyclicBarrier的使用
    CountDownLatch和CyclicBarrier都可以用来让一个线程等待其他线程执行完再继续执行一、CountDownLatchpublicclassTest8{staticLoggerLOG=LoggerFactory.ge......
  • 【CF1481F】AB Tree(单调队列优化多重背包)
    容易看出答案下界是树的最大深度,且构造方法只能是每一层的节点都染成同种颜色,可行性的判断是个背包问题。然后发现若不可行,就把除最后一层外的其它层每层都染成同种颜色,然......
  • CF--840--E
    关键也就是按照连通块进行划分,然后对连通块的大小进行完全背包就行了代码#include<bits/stdc++.h>usingnamespacestd;constintM=1e6+5;intf1[M],f2[M];int......
  • 为有状态应用而生,云原生本地存储Carina正式进入CNCF沙箱
    12月14日,云原生本地存储开源项目 Carina 通过了全球顶级开源基金会 CNCF技术监督委员会(TOC)的评定,正式成为CNCF沙箱级项目(SandboxProjects)。Carina是由博云于2021年10......
  • Jmeter——循环控制器中实现Counter计数器的次数重置
    近期在使用Jmeter编写个辅助测试的脚本,用到了多个LoopController和Counter。当时想的思路就是三个可变的数量值,使用循环实现;但第三个可变值的数量次数,是基于第二次循环中......
  • CF331C1 1100 *
    题意解析一开始以为是动态规划专题,想复杂了。其实就是模拟,每次挑最大的减。代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=......