AtCoder ~ E - Alphabet Tiles

Luogu ~ ABC358E Alphabet Tiles

题意简述

给定正整数 \(K\) 和 \(C_1,C_2,\dots,C_{26}\)。请求出长度在 \(1\) 到 \(K\) 之间,满足下列条件的字符串个数(取模 \(998244353\)):

  • 该字符串全由大写字母组成。
  • 对于 \(1\le i\le 26\),下面条件成立:
    • 设 \(a_i\) 为第 \(i\) 个大写字母,比如 \(a_5=\) E
    • 该字符串中,\(a_i\) 出现的次数不超过 \(C_i\)。

解题思路

我们考虑dp。设 \(f[i][j]\) 为用前 \(i\) 种字母,组成长度为 \(j\) 的字符串个数。

归纳得出,“前 \(i\) 种字母,组成长度为 \(j\)”,就相当于下面几种情况求和:

  • 前 \(i-1\) 种字母,组成长度为 \(j\)。
  • 前 \(i-1\) 种字母,组成长度为 \(j-1\),再在中间插入 \(1\) 个字母 \(i\)。
  • \(\dots\)
  • 前 \(i-1\) 种字母,组成长度为 \(j-t\),再在中间插入 \(t\) 个字母 \(i\)。

其中 \(t=\min(j,c[i])\)。

从而得到状态转移方程:

\(f[i][j]=\sum\limits_{s=0}^{\min(j,c[i])}f[i-1][j-s]*C_j^s\)。

(解释:\(j\)的长度中,先取出\(s\)个位置放字母\(i\),剩下位置就是字母\(1\sim (i-1)\)组成的长度为\(j\)的字符串了)

初始值:\(f[i][0]=1\)。

时间复杂度:\(C\)需要\(O(k^2)\)预处理,dp过程\(O(26*k^2)\)。总时间复杂度\(O(26*k^2)\)。

空间复杂度:\(O(k^2+26k)\),但\(f\)可以滚动数组变成\(O(k)\)。

Code

非滚动数组
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
using namespace std;
int k,c[30],C[1010][1010];
int f[30][1010];
int ans;
signed main(){
cin>>k;
for(int i=0;i<=k;i++){
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
for(int i=1;i<=26;i++) cin>>c[i];
for(int i=0;i<=26;i++) f[i][0]=1;
for(int i=1;i<=26;i++)
for(int j=1;j<=k;j++)
for(int s=0;s<=min(j,c[i]);s++)
f[i][j]=(f[i][j]+(f[i-1][j-s]*C[j][s]%mod))%mod;
for(int i=1;i<=k;i++) ans=(ans+f[26][i])%mod;
cout<<ans;
return 0;
}
滚动数组
#include<bits/stdc++.h>
#define int long long
#define mod 998244353
using namespace std;
int k,c[30],C[1010][1010];
int f[1010];
int ans;
signed main(){
cin>>k;
for(int i=0;i<=k;i++){
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
for(int i=1;i<=26;i++) cin>>c[i];
f[0]=1;
for(int i=1;i<=26;i++)
for(int j=k;j>=1;j--)//注意倒序枚举
for(int s=1;s<=min(j,c[i]);s++)
//不从0开始是因为已经有值了
f[j]=(f[j]+(f[j-s]*C[j][s]%mod))%mod;
for(int i=1;i<=k;i++) ans=(ans+f[i])%mod;
cout<<ans;
return 0;
}

[题解]ABC358E Alphabet Tiles的更多相关文章

  1. SPOJ:Lexicographically Smallest(并查集&排序)

    Taplu and Abhishar loved playing scrabble. One day they thought of inventing a new game using alphab ...

  2. SPOJ LEXSTR 并查集

    题目描述: Taplu and Abhishar loved playing scrabble. One day they thought of inventing a new game using ...

  3. Codeforces Round #292 (Div. 1) B. Drazil and Tiles 拓扑排序

    B. Drazil and Tiles 题目连接: http://codeforces.com/contest/516/problem/B Description Drazil created a f ...

  4. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  5. 算法(第四版)C# 习题题解——3.1

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  6. HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解

    Eight Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  7. BestCoder Round #85 前三题题解

    sum Accepts: 822 Submissions: 1744 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/13107 ...

  8. 【字符串】【hash】【倍增】洛谷 P3502 [POI2010]CHO-Hamsters 题解

        这是一道字符串建模+图论的问题. 题目描述 Byteasar breeds hamsters. Each hamster has a unique name, consisting of lo ...

  9. Drazil and Tiles CodeForces - 516B (类拓扑)

    Drazil created a following problem about putting 1 × 2 tiles into an n × m grid: "There is a gr ...

  10. Codeforces Round #292 (Div. 2) D. Drazil and Tiles [拓扑排序 dfs]

    传送门 D. Drazil and Tiles time limit per test 2 seconds memory limit per test 256 megabytes Drazil cre ...

随机推荐

  1. Linux下安装mamba-ssm踩过的坑

    起初的原因是,想要跑一个用到了mamba-ssm的项目,故尝试在wsl中配置mamba-ssm库.提示需要pip install mamba-ssm后报错频繁,遇到了许多问题.查阅了很多blog和is ...

  2. 洛谷 P5066 [Ynoi2014] 人人本着正义之名

    洛谷 P5066 [Ynoi2014] 人人本着正义之名 Problem 对一个01序列进行以下\(m\)个操作: 区间覆盖为0 区间覆盖为1 将区间\([l,r-1]\)中的数\(a_i\)同时变为 ...

  3. 【语义分割专栏】2:U-net原理篇(由浅入深)

    目录 前言 背景介绍 U-net核心剖析 编码解码结构(U形状) 卷积模式 跳跃连接 add concat 其他细节 overlap-tile策略 弹性形变 U-net模型代码 结语 参考资料 前言 ...

  4. 最快的流媒体服务器搭建 smart_rtmpd

    说明 流媒体服务器是一个很专业的名词,对于圈外人来说,可能显得比较高深.但是日常应用中还是经常需要用到它,搭建流媒体服务器需要了解各种名词,系统,环境配置,使用方法,使用流程.这让很多圈外人感觉无从下 ...

  5. 安全感知平台SIP-部署简介

    部署安装前前期调研: NDR:全流量高级威胁检测: NDR是一款专门围绕"高级威胁检测"为核心,主打全流量采集.快速检测.威胁定位.研判溯源.联动闭环一体化的专业流量检测系统:内置 ...

  6. 理解PHP array_reduce函数

    http://blog.tanteng.me/2015/07/php-array-reduce/

  7. C# WinForm 控件设置双缓存

    DataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instan ...

  8. VisualStudioCode 创建Vue 3.0 项目

    https://vitejs.cn/guide/#%E6%90%AD%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA-vite-%E9%A1%B9%E7%9B%AE第一步npm ...

  9. 安全可控·国产典范—上海卓岚ZLAN5107-C全国产化 串口服务器助力工业通信自主化

    一.为什么选择纯国产化串口服务器? 在当前国际形势下,关键基础设施的通信安全至关重要.工业通信设备的供应链安全与数据主权问题日益凸显.传统串口服务器依赖国外芯片(如ARM架构)和操作系统(如linxu ...

  10. java基础——函数、数组、排序

    函数的重载 函数的重载:在一个类中出现两个或者两个以上的同名函数,这个称作为函数的重载. 函数重载的作用: 同一个函数名可以出现了不同的函数,以应对不同个数或者不同数据类型的参数. 函数重载的要求: ...