AtCoder Beginner Contest 215 E - Chain Contestant (状压dp)

简介: AtCoder Beginner Contest 215 E - Chain Contestant (状压dp)

原题链接

题意:

给定一个长度为n ( n < = 1000 )的仅有10种字符的字符串。求子序列的个数,子序列满足相同字母的位置必须相邻。

思路:

下面是样例1 11的13种答案:

B

G

BG

B

BB

GB

H

BH

GH

BGH

BH

BBH

GBH

13

由于字符的种类很少,考虑用状压解决每个字符选o r不选。

假设d p [ i ] [ j ] [ k ]表示从前i ii个位置中选,并且结尾的字母为j ,字母种类的选择情况为k的符合题意的子序列个数。

其中k 是二进制数,该位为1说明该字母已经选择了,为0说明没有选该字母。

对于转移,有三种选择:


当前字母不选,d p [ i ] [ j ] [ k ] = d p [ i − 1 ] [ j ] [ k ]

只选当前字母,d p [ i ] [ n o w ] [ 1 < < n o w ] = d p [ i − 1 ] [ n o w ] [ 1 < < n o w ] + 1

选择当前字母并且从前面的状态转移过来:

当前字母在之前出现过:d p [ i ] [ n o w ] [ j ] = ( d p [ i ] [ n o w ] [ j ] + d p [ i − 1 ] [ n o w ] [ j ] )

没有出现过:d p [ i ] [ n o w ] [ j ∣ 1 < < n o w ] = ( d p [ i ] [ n o w ] [ j ∣ 1 < < n o w ] + d p [ i − 1 ] [ k ] [ j ] )

空间上可以用滚动数组优化掉一维。

代码:

// Problem: E - Chain Contestant
// Contest: AtCoder - AtCoder Beginner Contest 215
// URL: https://atcoder.jp/contests/abc215/tasks/abc215_e
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll>PLL;
typedef pair<int, int>PII;
typedef pair<double, double>PDD;
#define I_int ll
inline ll read(){ll x = 0, f = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-')f = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}return x * f;}
inline void write(ll x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
#define read read()
#define closeSync ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define multiCase int T;cin>>T;for(int t=1;t<=T;t++)
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define perr(i,a,b) for(int i=(a);i>(b);i--)
ll ksm(ll a, ll b,ll mod){ll res = 1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
const int maxn=1e6+7,mod=998244353;
char s[1100];
int n,dp[1100][11][1<<11];
int main(){
#ifdef LOCAL
    freopen("in.in","r",stdin);
    freopen("out.out","w",stdout);
#endif
  cin>>n>>s+1;
  rep(i,1,n){
    int now=s[i]-'A';
    rep(j,0,9)
      repp(k,0,1<<10){
        dp[i][j][k]=dp[i-1][j][k];//不选当前字母
      } 
    dp[i][now][1<<now]=(dp[i][now][1<<now]+1)%mod;//只选当前字母
    repp(j,0,1<<10){
      if(j>>now&1){
        dp[i][now][j]=(dp[i][now][j]+dp[i-1][now][j])%mod;//当前字母出现过
      }
      else{
        rep(k,0,9)
          if(k!=now)
            dp[i][now][j|1<<now]=(dp[i][now][j|1<<now]+dp[i-1][k][j])%mod;
      }
    }
  }
  int ans=0;
  rep(i,0,9)
    repp(j,0,1<<10)
      ans=(ans+dp[n][i][j])%mod;
  write(ans);
  return 0;
}
/*
B
G
BG
B
BB
GB
H
BH
GH
BGH
BH
BBH
GBH
13
*/

参考



目录
相关文章
|
应用服务中间件 Linux PHP
深入理解Nginx工作原理及优化技巧(上)
深入理解Nginx工作原理及优化技巧
深入理解Nginx工作原理及优化技巧(上)
|
Web App开发 运维 监控
物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
物联网相比这些年来,大家都了解很多了,直白的讲,就是万物互联,万物上网。那么这里的物联网3D就是指通过三维可视化的方式展现物联网监控设备。对设备的位置信息,状态信息能一目了然。面向IT设施和资源的一体化综合监控与远程操控方式。通过三维可视化方式展现,解决监控资源繁多、开源工具使用复杂、问题定位困难等问题。
1360 0
物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课
|
6月前
|
存储 人工智能 自然语言处理
拔俗AI自动化评价分析系统:让数据说话,让决策更智能
在用户体验为核心的时代,传统评价分析面临效率低、洞察浅等痛点。本文基于阿里云AI与大数据技术,构建“数据-算法-应用”三层智能分析体系,实现多源数据实时接入、情感与主题精准识别、跨模态融合分析及实时预警,助力企业提升运营效率、加速产品迭代、优化服务质量,并已在头部电商平台成功落地,显著提升用户满意度与商业转化。
610 0
|
机器学习/深度学习 人工智能 自然语言处理
Dolphin:40语种+22方言!清华联合海天瑞声推出的语音识别大模型,识别精度超Whisper两代
Dolphin是清华大学与海天瑞声联合研发的语音识别大模型,支持40种东方语言和22种中文方言,采用CTC-Attention混合架构,词错率显著低于同类模型。
5136 50
Dolphin:40语种+22方言!清华联合海天瑞声推出的语音识别大模型,识别精度超Whisper两代
|
移动开发 安全 Swift
TIOBE 6月榜单:Swift强势挺进,编程语言版图的悄然变革
【6月更文挑战第21天】**TIOBE 6月榜:Swift晋升至第12,凸显其在苹果生态和移动开发中的重要性。自2014年发布以来,Swift凭借强类型、内存安全等特性赢得开发者青睐。排名上升源于苹果支持、开源跨平台、教育普及及性能提升。Swift的崛起影响行业生态,提升开发效率,预示着语言生态、跨平台和教育先行的趋势。未来,Swift有望扩展到更多领域,持续优化并深化教育影响。**
523 6
|
机器学习/深度学习 算法 Python
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。
随机森林算法是一种强大的集成学习方法,通过构建多个决策树并综合其结果进行预测。本文详细介绍了随机森林的工作原理、性能优势、影响因素及调优方法,并提供了Python实现示例。适用于分类、回归及特征选择等多种应用场景。
1008 7
|
机器学习/深度学习 算法 测试技术
「软件项目管理」一文详解软件项目成本计划
该文章详细解释了软件项目成本估算的过程与方法,涵盖了代码行估算法、功能点估算法、用例点估算法、类比估算法、自下而上估算法、参数模型估算法及专家估算法等多种技术,并探讨了成本预算的制定步骤。
「软件项目管理」一文详解软件项目成本计划
|
数据可视化 UED
移动应用的UI/UX设计原则与实践
【7月更文挑战第2天】移动应用UI/UX设计聚焦简约、一致性与用户中心原则。关键在于理解用户需求,创建清晰的视觉层次,实现响应式布局。UX关注反馈速度、情感连接及无障碍访问。通过用户调研、原型测试和持续迭代,提升满意度和产品竞争力。
|
人工智能 Oracle 关系型数据库
【AI Agent系列】【LangGraph】1. 进阶实战:给你的 LangGraph 加入条件分支(Conditional edges)
【AI Agent系列】【LangGraph】1. 进阶实战:给你的 LangGraph 加入条件分支(Conditional edges)
3916 1
|
JavaScript 前端开发
JavaScript时间戳获取及时间戳判断(同时设置不同的颜色。已开始的事件显示绿色,未开始的事件显示黑色,过去的事件显示灰色)
JavaScript时间戳获取及时间戳判断(同时设置不同的颜色。已开始的事件显示绿色,未开始的事件显示黑色,过去的事件显示灰色)
382 0

热门文章

最新文章

下一篇
开通oss服务