[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种非常强大的调试助 ...
随机推荐
- 【Tomcat】Tomcat配置与优化(内存、并发、管理)【自己配置】
一.JVM内存配置优化 主要通过以下的几个jvm参数来设置堆内存的: -Xmx512m 最大总堆内存,一般设置为物理内存的1/4 -Xms512m 初始总堆内存,一般将它设置的和最大堆内存一样大,这样 ...
- 使用Picker的时候,让input输入框使用焦点,手机键盘不弹出
$("#address").click(function(){ document.activeElement.blur(); })
- python的新特性
http://www.jb51.net/article/67699.htm Python中用format函数格式化字符串的用法:http://www.jb51.net/article/63672.ht ...
- java基础32 List集合下的ArrayList集合
单例集合体系: ---------| collection 单例集合的根接口--------------| List 如果实现了list接口的集合类,具备的特点:有序,可重复 注:集合 ...
- js字符串基本操作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtm ...
- Codeforces 807C - Success Rate(二分枚举)
题目链接:http://codeforces.com/problemset/problem/807/C 题目大意:给你T组数据,每组有x,y,p,q四个数,x/y是你当前提交正确率,让你求出最少需要再 ...
- 【[国家集训队]小Z的袜子】
对于L,R的询问.设其中颜色为x,y,z的袜子的个数为a,b,c...那么答案即为(a*(a-1)/2+b*(b-1)/2+c*(c-1)/2....)/((R-L+1)*(R-L)/2)化简得:(a ...
- Linux学习笔记:cp和scp复制文件
拷贝文件和文件夹,在Linux上通过cp命令来实现. cp:用户当前机器的文件复制 scp:通过ssh本机和其他机器的文件复制 secure copy cp a.txt b.txt scp a.txt ...
- 20165203《Java程序设计》第七周Java学习总结
20165203<Java程序设计>第七周Java学习总结 教材学习内容总结 第11章 JDBC与MySQL数据库 MySQL数据库管理系统 MySQL数据库管理系统,简称MySQL,是世 ...
- 函数fgets和fputs、fread和fwrite用法小结(转)
字符串读写函数fgets和fputs: 1.fgets()函数:原型char *fgets(char *s, int n, FILE *stream);从流中读取n-1(n默认1024)个字符之前,如 ...