首页 > 其他分享 >codeforces 118D D. Caesar's Legions(dp)

codeforces 118D D. Caesar's Legions(dp)

时间:2023-04-23 21:37:32浏览次数:41  
标签:int k2 k1 Caesar 1min 118D include dp


题目链接:

codeforces 118D


题目大意:

给出n1个1,n2个2,给出k1和k2代表连续的1和2的最大长度,问能够构造的合法的不同串的数量。


题目分析:

  • 能够递推,所以想到能够利用dp做。
  • 首先我们定义状态,dp[i][j][k][2]代表以1或2结尾,结尾相同的元素的数量为k,1的总数是j的当前序列长度为i的串的数量。
  • 首先是对状态进行初始化,dp[1][1][1][0] = dp[1][0][1][1] = 1
  • 转移方程如下:
    dp[i][j][1][0]=∑k=1min(k2,i−j)dp[i−1][j−1][k][1]
    dp[i][j][1][1]=∑k=1min(k1,j)dp[i−1][j][k][0]
    dp[i][j][k][0]=∑k=1min(k1,j)dp[i−1][j−1][k−1][0]
    dp[i][j][k][1]=∑k=1min(k2,i−j)dp[i−1][j][k−1][1]
  • 最终结果的统计方法:
    ans=∑i=1k1dp[n][n1][i][0]+∑i=1k2dp[n][n1][i][1]

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#define MAX 107

using namespace std;

int n1,n2,k1,k2;
const int mod = 1e8;
int dp[MAX<<1][MAX][12][2];


int main ( )
{
    while ( ~scanf ( "%d%d%d%d" , &n1 , &n2 , &k1 , &k2 ) )
    {
        memset ( dp , 0 , sizeof ( dp ) );
        dp[1][1][1][0] = 1;
        dp[1][0][1][1] = 1;
        int n = n1+n2;
        for ( int i = 2 ; i <= n; i ++ )
            for ( int j = 0; j <= i && j <= n1 ; j++ )
            {
                for ( int k = 1; k <= k2 && k <= i-j ; k++ )
                {
                    dp[i][j][1][0] += dp[i-1][j-1][k][1];
                    dp[i][j][1][0] %= mod;
                }
                for ( int k = 1; k <= k1 && k <= j ; k++ )
                    if ( i-1 >= j )
                    {
                        dp[i][j][1][1] += dp[i-1][j][k][0];
                        dp[i][j][1][1] %= mod;
                    }
                for ( int k = 2; k <= j&& k <= k1 ; k++ )
                {
                    dp[i][j][k][0] += dp[i-1][j-1][k-1][0];
                    dp[i][j][k][0] %= mod;
                }
                if ( i-1 < j ) continue;
                for ( int k =2 ; k <= i-j && k <= k2 ; k++ )
                {
                    dp[i][j][k][1] += dp[i-1][j][k-1][1];
                    dp[i][j][k][1] %= mod;
                }
            }
        /*cout << "-------------------" << endl;
        cout << "====================" << endl;
        cout << dp[3][1][1][0] << endl;
        cout << "====================" << endl;
        cout << dp[5][2][1][0] << endl;
        cout << dp[5][2][1][1] << endl;
        cout << dp[5][2][2][1] << endl;
        cout << "-------------------" << endl;*/
        int ans = 0;
        for ( int i = 1 ; i <= k1 ; i++ )
        {
            ans += dp[n][n1][i][0];
            ans %= mod;
        }
        for ( int i = 1 ; i <= k2 ; i++ )
        {
            ans += dp[n][n1][i][1];
            ans %= mod;
        }
        printf ( "%d\n" , ans );
    }
}


标签:int,k2,k1,Caesar,1min,118D,include,dp
From: https://blog.51cto.com/u_7936627/6218743

相关文章

  • codeforces 264B B. Good Sequences(dp+数论)
    题目链接:codeforces264B题目大意:给出n个数,利用这n个数构造一个好的序列,好的序列是单调增的,而且序列中相邻的两个元素都不互质,问最长的好序列的长度是多少。题目分析:首先我们定义状态dp[i]表示当前的数进行构造的序列末尾的数的质因数包含i的时候的最长的情况。然后我们从小到大枚......
  • codeforces 159D D. Palindrome pairs( manacher+dp )
    题目链接:codeforces159D题目大意:给出一个字符出,求取这个字符串中互相不覆盖的两个回文子串的对数。题目分析:首先能够用manacher模板,因为这个算法处理的字符串的长度式奇数,所以我们首先将原字符串拓展,也就是用一个没有出现过的子串填充到每两个字符之间,首位也要添加,这样处理后得到......
  • codeforces 414B B. Mashmokh and ACM(dp)
    题目链接:codeforces414B题目大意:定义一个序列,前一项能够整除后一项,给定这个序列中数的取值范围和序列的长度,问有多少种构造方法。题目分析:我们定义状态dp[i][j]为前i项已经确定且第i项为j的方案数。转移方程dp[i][j]=∑k|jdp[i−1][k]复杂度O(n⋅k)AC代码:#include<iostream>......
  • codeforces 573B B. Bear and Blocks(线段树+dp)
    题目链接:codeforces573B题目大意:给出n个连续塔,每个塔有高度hi,每次取走最外层的块,问需要多少次操作能够拿光所有的块。题目分析:首先我们可以知道第一次操作时,对于每个塔的变化满足如下的公式:hi=min(hi−1,hi−1,hi+1)每次操作都满足如下的递推式,我们递推一下得到第k次操作第i......
  • 插头dp
    插头dp是什么,这里只有插头在状态压缩动态规划中,有一类是需要记录若干个元素的联通情况,称之为基于连通性状态压缩的动态规划,也就是插头dp在大部分棋盘状压dp中,状态划分可以依据行或列进行划分,行列之间相对独立,但有时却不行,例如让你在棋盘中对联通块进行操作,下图的联通块是无......
  • m基于BP译码算法的QC-LDPC误码率matlab仿真,对比不同译码迭代次数的误码率性能
    1.算法仿真效果matlab2022a仿真结果如下: 2.算法涉及理论知识概要       LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现......
  • m基于BP译码算法的QC-LDPC误码率matlab仿真,对比不同译码迭代次数的误码率性能
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现简单,易于进行理论分......
  • IPV6-NDP邻居发现协议
    概述 NDP(NeighborDiscoveryProtocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARP、ICMP路由器发现和ICMP重定向等协议,并对它们作了改进。   IPv6ND(IPv6NeighborDiscovery,IPv6邻居发现)协议使用五种类型的ICMPv6消息,实现下面一些功能:地址解析、验证邻居是否......
  • 云原生之部署wordpress博客及设置圣诞主题风格
    (云原生之部署wordpress博客及设置圣诞主题风格)一、前言1.本次实践目的1.使用docker部署wordpress网站2.配置圣诞主题风格2.wordpress介绍WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把WordPress当作一个......
  • 如何衡量并最大化CDP的ROI?
    成功的客户体验计划最重要的秘密配方是什么?根据全球百位商业领导者的调研结果,答案是:优质的数据。随着去年数字技术普及的爆发,许多企业争相寻求适应数字化,数据质量成为了他们关注的头等大事。然而不幸的是,许多企业缺乏正确的技术来应对不断增长的客户数据量和复杂度。与此同时,许多......