TJOI2018Party

题目描述

小豆参加了\(NOI\)的游园会,会场上每完成一个项目就会获得一个奖章,奖章 只会是\(N\), \(O\), \(I\)的字样。在会场上他收集到了\(K\)个奖章组成的串。

兑奖规则是奖章串和兑奖串的最长公共子序列长度为小豆最后奖励的等级。

现在已知兑奖串长度为\(N\),并且在兑奖串上不会出现连续三个奖章为\(NOI\),即奖章中不会出现子串\(NOI\)

现在小豆想知道各个奖励等级会对应多少个不同的合法兑奖串。

题解

我们可以先考忽略那些奇奇怪怪的限制条件,直接考虑如何统计序列数。

我们先考虑\(LCS\)的dp方法。
\[ dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+(s[i]==t[j])) \]
我们如果把第二维单独拿出来考虑,我们可以发现第二维是一个单调不降的数列而且前后两项的差是小于等于1的。

因为第二维的长度非常小,所以我们可以把第二维差分之后状压起来作为我们的状态。

而且有一个好处,我们知道了这个状态,就能发当前\(dp\)值还原出来,假设我们知道了下一个字符时什么,我们就可以知道转移后的状态是什么了。

所以我们预处理\(g[i][j]\)表示当前状态为\(i\),新加入字符为\(j\),能够转移的状态。

然后我们再设\(dp[i][j][k]\)表示做到第\(i\)为,当前状态为\(j\),匹配到k个字符(这个是判断那个特殊限制用的),随便转移一下就好了。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1e9+7;
int tran[200],g[3][1<<16],dp[2][1<<16][3],n,k,nw[20],a[20],ma,ans[20];
char s[20];
inline int rd(){int x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
inline void MOD(int &x){x=x>=mod?x-mod:x;}
int main(){n=rd();k=rd();tran['N']=0;tran['O']=1;tran['I']=2;scanf("%s",s+1);for(int i=1;i<=k;++i)a[i]=tran[(int)s[i]];ma=(1<<k+1);for(int o=0;o<3;++o){for(int i=0;i<ma;++i){for(int j=0;j<=k;++j){nw[j]=(i&(1<<j))!=0;if(j)nw[j]+=nw[j-1]; }for(int j=k;j>=1;--j){nw[j]=max(nw[j],nw[j-1]);if(a[j]==o)nw[j]=max(nw[j],nw[j-1]+1);}for(int j=1;j<=k;++j)nw[j]=max(nw[j],nw[j-1]);int s=0;for(int j=k;j>=1;--j)nw[j]=nw[j]-nw[j-1];for(int j=0;j<=k;++j)s|=(1<<j)*nw[j];g[o][i]=s;}}int now=1,pre=0;dp[now][0][0]=1;for(int i=0;i<n;++i){swap(now,pre);memset(dp[now],0,sizeof(dp[now]));for(int j=0;j<ma;++j)for(int l=0;l<3;++l)if(dp[pre][j][l])for(int p=0;p<3;++p){int no=(p==l)?l+1:(p==0); if(no==3)continue;MOD(dp[now][g[p][j]][no]+=dp[pre][j][l]);}}for(int i=0;i<ma;++i){for(int j=0;j<=k;++j){nw[j]=(i&(1<<j))!=0;if(j)nw[j]+=nw[j-1];}   MOD(ans[nw[k]]+=(1ll*dp[now][i][0]+dp[now][i][1]+dp[now][i][2])%mod);} for(int i=0;i<=k;++i)printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/10554475.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5 Dashboard – 那些让你激动的 Web 技术

HTML5 Dashboard 是一个 Mozilla 推出的项目&#xff0c;里面展示了最前沿的 HTML5&#xff0c;CSS3&#xff0c;JavaScript 技术。每一项技术都有简洁&#xff0c;在线演示以及详细的文档链接。这些技术将成为未来一段时间 Web 开发的顶尖技术&#xff0c;如果不想落伍的话就赶…

通过自动回复机器人学Mybatis---基础版

第1章 案例简介 介绍要实现的案例情况&#xff0c;后面会通过这个案例来学习 Mybatis第2章 实战第一部----黎明前的黑暗 在没有 Mybatis 的情况下&#xff0c;使用 Jsp Servlet Jdbc 实现案例中的一个模块开发流程1&#xff1a; 开发流程2&#xff1a; 开发流程3&#xff1a;…

部署到Maven中央存储库

您需要使您的Java库公开访问吗&#xff1f; 您的项目托管在GitHub上吗&#xff1f; 您是否喜欢“将所有功能都部署到Maven Central Repository”按钮的想法&#xff1f; 我将展示如何使用maven-release-plugin进行设置 。 源代码托管在GitHub上&#xff0c;因此还将描述对源代码…

Scroll Depth – 衡量页面滚动的 Google 分析插件

Scroll Depth 是一个小型的 Google Analytics&#xff08;谷歌分析&#xff09;插件&#xff0c;可以让你衡量用户在页面上滚动了多远。它可以监控 25%、50%、75% 和 100% 四个滚动点&#xff0c;并发送谷歌分析事件。 您还可以跟踪页面上的特定元素是否滚动到视图中。例如在博…

aws ec2时间_AWS中自动化的三大领域,以避免支付过多的云账单

AWS是全球最常用的云服务之一。 Gartner Magic Quadrant将AWS评为最大的IaaS提供商。每个可能的域都由企业使用AWS服务。 全球约有 1,000,000家公司正在使用AWS作为其IaaS提供商。从Netflix到Unilever再到Met Office&#xff0c;每个人都转移到AWS上的云基础架构。既然您正在阅…

linux vector 头文件,LINUX 之Vector用法

在Linux开发过程中常用到的一个功能----列表显示.如何将中心数据进行列表显示呢?这里就用到了VECTOR容器.从中心获取的数据通过VECTOR容器传输给站点程序从而实现批量数据的传输.VECTOR容器常用的函数包括以下几个1.push_back函数函数原型:void push_back(const T& x);实现…

MySQl的一些基本知识(1)

数据库优化操作&#xff1a; MySQL优化 数据库优化维度有四个: 硬件、系统配置、数据库表结构、SQL及索引 优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 运行机制原理和底层架构 MySQL的查询优化&#x…

将一个word文档按一页或多页拆分成多个文档

工作中&#xff0c;有时候碰到需要将一个比较大的word按照指定的页数分割成若干个小的word文档&#xff0c;下面提供分割的方法供参考&#xff1a; 一、按照单页拆分 1、在Word里面打开那个需要分割的文档&#xff08;假设它的文件名叫做“test.doc”&#xff09;&#xff1b; …

Croppic – 免费开源的 jQuery 图片裁剪插件

Croppic 这款开源的 jQuery 图片裁剪插件能够满足网站开发人员各种不同的使用需要。只需要简单的上传图片&#xff0c;就可以实现你想要的图像缩放和裁剪功能。因为使用了 HTML5 FormData 对象&#xff0c;所以目前只支持 IE 10 、Chrome 和 Firefox 等现代浏览器。 您可能感兴…

应用面向方面的编程

1.引言 面向方面的编程的主要目标是将跨领域的关注点分离。 当我们谈论跨领域的关注时&#xff0c;我们指的是在我们的系统或应用程序中的多个地方使用的通用功能。 这些概念包括&#xff1a; 记录中 交易管理 错误处理 监控方式 安全 实现这种分离的方法是将这些概念模块…

最大连续子序列----DP动态规划

1196: 最大连续子序列 时间限制: 1 Sec 内存限制: 128 MB提交: 44 解决: 20[提交][状态][讨论版] 题目描述 给定 K 个整数的序列{ N1, N2, ..., NK } &#xff0c;其任意连续子序列可表示为{ Ni, Ni1,...,Nj} &#xff0c;其中1 < i< j < K。最大连续子序列是所有…

linux钟java运行命令,在java中运行linux命令

我想在java中运行“ls”命令&#xff0c;我的代码是- 注意&#xff1a; - 我正在使用WINDOWS。在java中运行linux命令import java.io.IOException;public class Example{public void fn(){Runtime run Runtime.getRuntime();Process p null;String cmd "ls";try {…

python3seek_Python seek()和tell()函数详解

在讲解 seek() 函数和 tell() 函数之前&#xff0c;首先来了解一下什么是文件指针。我们知道&#xff0c;使用 open() 函数打开文件并读取文件中的内容时&#xff0c;总是会从文件的第一个字符(字节)开始读起。那么&#xff0c;有没有办法可以自定指定读取的起始位置呢&#xf…

n=n+1 放在print(s)的前/后的影响

# 123456.....100 ?#关键在于,当n为时,才print(s)n 1s 0while n < 101: s s n if n 100: #关键在于这一步, 我用if来判断,当n为100时,才print(s), 否则继续while循环 print(s) n n 1          转载于:https://www.cnblogs.co…

ScrollReveal.js – 帮助你实现超炫的元素运动效果

ScrollReveal.js 用于创建和管理元素进入可视区域时的动画效果&#xff0c;帮助你的网站增加吸引力。只需要给元素增加 data-scrollreveal 属性&#xff0c;当元素进入可视区域的时候会自动被触发设置好的动画。 您可能感兴趣的相关文章2013年最受欢迎的10篇前端开发博文小伙伴…

JDBC布尔兼容性列表

有趣的是&#xff0c;布尔类型只是在SQL标准后期才引入&#xff0c;即SQL&#xff1a;1999 。 即使在今天&#xff0c;并非所有数据库本身都支持BOOLEAN或BIT类型。 最重要的是&#xff0c;我们仍然可以在Oracle中等待一段时间。 这是2002年以来关于该主题的“问汤姆”的观点&a…

linux用户操作的日志,linux 用户操作记录并录入日志

1. 添加bash全局配置文件&#xff1a;cd /etc/profile.dvi log_command.sh输入如下内容&#xff1a;export PROMPT_COMMAND‘RETRN_VAL$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\[ ]*//" ) [$RETRN_VAL]"‘2. 添加rsy…

我实在不懂Python的Asyncio

原语 事件循环(Event Loop)Awaitables和CoroutinesCoroutine WrappersAwaitables and FuturesTasksHandlesExecutorsTransport and Protocols如何使用Asyncio上下文数据个人想法这是Flask&#xff0c;Sentry的作者Armin Ronacher的一篇博客&#xff0c;这篇文章的影响很大&…

GDI+与WPF中的颜色简析

GDI与WPF中的颜色简析 原文:GDI与WPF中的颜色简析--------------------------------------------------------------------------------引用或转载时请保留以下信息&#xff1a;大可山 [MSN:a3news(AT)hotmail.com] http://www.zpxp.com http://www.brawdraw.com萝卜鼠在线图形…

pythondatetime_Date

在JavaScript中&#xff0c;Date对象用来表示日期和时间。要获取系统当前时间&#xff0c;用&#xff1a;var now new Date();now; // Wed Jun 24 2015 19:49:22 GMT0800 (CST)now.getFullYear(); // 2015, 年份now.getMonth(); // 5, 月份&#xff0c;注意月份范围是0~11&…