[xsy3343]程序锁
题意:有两个序列,序列中数字$\in\{-1,0,1\}$
有两个指针,初始时分别指向两个序列的开始位置,有一个初始为$0$的数$a$,重复以下过程直到两个指针都指向序列末尾后
如果一个指针指向末尾后,那么移动另一个指针
否则如果$a>0$,随机移动一个指针
否则如果至少一个指针指向$1$,随机移动一个指向$1$的指针
否则随机移动一个指针
每移动一个指针,就把这个指针指向的数加到$a$上
问有多少种填$0$为$\pm1$的方法使得任何时候都有$a\geq0$
首先是对填好的序列进行判定,在两个序列中分别找到以$-1$结尾的最小前缀和$s_a,s_b$(如果序列全为$1$就选择总和),如果两个序列都满足这个最小前缀和$\ne$总和,那么条件是$s_a+s_b\geq-1$(因为两个$-1$后面一定都紧跟着一个$1$,而后面的前缀和不会更小,所以可以满足),否则需要满足$s_a+s_b\geq0$(一个序列的指针已经到了末尾后,只能被强迫移动另一个指针)
现在要DP,正着DP很困难,考虑倒着DP,这样每次只会增加一个小前缀
设$f_{i,j,k}$表示填完$[i,n]$,这些位置相对于$i$的前缀和中,以$-1$结尾的最小前缀和$=j$的方案数,$k$表示$j$是否等于总和
如果$i-1$位可以填$1$,那么有$f_{i,j,0}\rightarrow f_{i-1,j+1,0},f_{i,j,1}\rightarrow f_{i-1,j+1,1}$,因为在最前面加一个$1$并不改变原来的最小前缀和
如果$i-1$位可以填$-1$,那么有$f_{i,j,0}\rightarrow f_{i-1,\min(-1,j-1),0},f_{i,j,1}\rightarrow f_{i-1,\min(-1,j-1),[j\le0]}$,因为增加了一个值为$-1$的前缀和,所以原来$j>0$且最小前缀和$=j$的方案会变为最小前缀和$=-1\ne j-1$
对两个序列分别DP后直接统计答案即可
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef int pr[2];
const int mod=998244353;
int mul(int a,int b){return(ll)a*b%mod;}
void inc(int&a,int b){(a+=b)>=mod?a-=mod:0;}
struct str{
char s[5010];
int n;
pr _f[10010],_g[10010],*f=_f+5000,*g=_g+5000;
void work(){
int i,j;
scanf("%s",s+1);
n=strlen(s+1);
f[0][1]=1;
for(i=n;i>0;i--){
memset(_g,0,sizeof(_g));
for(j=-n;j<=n;j++){
if(s[i]!='P'){//+
inc(g[j+1][0],f[j][0]);
inc(g[j+1][1],f[j][1]);
}
if(s[i]!='V'){//-
inc(g[min(-1,j-1)][0],f[j][0]);
inc(g[min(-1,j-1)][j<=0],f[j][1]);
}
}
memcpy(_f,_g,sizeof(_g));
}
}
}a,b;
int main(){
int i,j,s;
a.work();
b.work();
s=0;
for(i=-a.n;i<=a.n;i++){
for(j=-b.n;j<=b.n;j++){
if(i+j>=-1)inc(s,mul(a.f[i][0],b.f[j][0]));
if(i+j>=0){
inc(s,mul(a.f[i][0],b.f[j][1]));
inc(s,mul(a.f[i][1],b.f[j][0]));
inc(s,mul(a.f[i][1],b.f[j][1]));
}
}
}
printf("%d",s);
}
[xsy3343]程序锁的更多相关文章
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
- 正尝试在 OS 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样...
出错提示: 正尝试在 OS 加载程序锁内执行托管代码.不要尝试在 DllMain 或映像初始化函数内运行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中增加了42种非常强大的调试助手 ...
- 检测到 LoaderLock:DLL"XXXX"正试图在OS加载程序锁内执行
解决方法: ctrl+D+E或alt+ctl+e或使用菜单调试——>异常——>异常窗口——>Managed Debugging Assistants——>去掉LoaderLoc ...
- 正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码
来自:http://www.cnblogs.com/lcxu2/archive/2011/01/16/2004016.html 正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain 或 ...
- android149 360 程序锁输入密码
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- android147 360 程序锁fragment
package com.itheima.mobileguard.fragment; import java.util.ArrayList; import java.util.List; import ...
- android147 360 程序锁
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Android安全问题 程序锁
导读:本文介绍如何实现对应用加锁的功能,无须root权限 某些人有时候会有这样一种需求,小A下载了个软件,只是软件中的美女过于诱惑与暴露,所以他不想让别人知道这是个什么软件,起码不想让别人打开浏 览. ...
- 正尝试在 OS 载入程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起。
出错提示: 正尝试在 OS 载入程序锁内执行托管代码. 不要尝试在 DllMain 或映像初始化函数内执行托管代码,这样做会导致应用程序挂起. 原因分析: .NET2.0中添加了42种非常强大的调试助 ...
随机推荐
- Velocity VelocityEngine 支持多种loader 乱码问题
最近升级团队的代码生成工具,此工具是velocity实现的. 之前习惯使用UTF-8编码,现在团队使用GBK. 所以遇到一种场景,模板文件使用UTF-8(习惯了所有任性),输出文件使用GBK(项目需要 ...
- Unix/Linux系统时间函数API
首先说明关于几个时间的概念: 世界时:起初,国际上的标准时间是格林尼治标准时间,以太阳横穿本初子午线的时刻为标准时间正午12点.它根据天文环境来定义,就像古代人们根据日晷来计时一样,如下图: 原子时: ...
- 查看Linux系统版本的几种方法
第一种: cat /etc/os-release # 或者 cat /etc/redhat-release 结果如下: NAME="Ubuntu" VERSION="16 ...
- 2016.5.16——leetcode:Rotate Array,Factorial Trailing Zeroe
Rotate Array 本题目收获: 题目: Rotate an array of n elements to the right by k steps. For example, with n = ...
- Hibernate5笔记3--详解Hibernate的API
详解Hibernate的API: (1)Configuration接口: org.hibernate.cfg.Configuration接口的作用是加载主配置文件及映射文件,以实现对Hibernate ...
- MVVM模式的 数据绑定
数据绑定要达到的效果 数据绑定要达到什么效果呢,就是在界面中绑定了数据源之后,数据在界面上的修改能反映到绑定源,同时绑定源的修改也能反映到界面上.从界面反映到绑定的数据源是很容易理解的,因为在绑定过程 ...
- C#里partial关键字的作用
1. 什么是局部类型?C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中.局部类型适用于以下情况: (1) 类型特别大,不宜放在一个 ...
- Pytorch自定义数据库
1)前言 虽然torchvision.datasets中已经封装了好多通用的数据集,但是我们在使用Pytorch做深度学习任务的时候,会面临着自定义数据库来满足自己的任务需要.如我们要训练一个人脸关键 ...
- Unity教程之-Unity3d中针对Android Apk的签名验证(C#实现)
当Unity开发的游戏以Android Apk的形式发布之后,经常会遇到的一种情况就是别人对我们的游戏进行二次打包,也就是用他们的签名替换掉我们的签名,从而堂而皇之的将胜利果实占为己有.面对这样的情况 ...
- go 切片的 插入、删除
package main import ( "fmt" ) func InsertSpringSliceCopy(slice, insertion []string, index ...