uoj#149
dp
没想出来 最先开始想 dp[i][j][k]表示s匹配到i,t匹配到j,当前分了k段的方案数
s[i]==t[j] dp[i][j][k]+=dp[i-1][j-1][k-1] s[i]==t[j]&&s[i-1]==t[j-1] dp[i][j][k]+=dp[i-1][j-1][k] dp[i][j][k]+=dp[i-1][j][k]
问题出在中间那个式子,但是我不知道怎么改,这样会多出来很多状态,比如说aabaab和aabk=1
dp[5][2][1]=4 因为dp[5][2][1]+=dp[4][1][1] 但是这样会出现不连续的,第一个a和第5个a匹配了,因为上一个方案可能没选那位,但是我们当成可以接在上一个后面。
那么我们再定义一个f[i][j][k]表示s匹配到i,t匹配到j,分成k段,i和j同时选的方案数。这样就解决了刚才的那个问题,dp[i][j][k]=dp[i-1][j][k]+f[i][j][k]
s[i]==t[j] f[i][j][k]=f[i-1][j-1][k]+dp[i-1][j-1][k-1] 否则f[i][j][k]=0
这样就可以转移了
如果当前dp不满足一些转移的条件,我们可以创造一些条件,比如多设一个数组,在树形dp求直径也用到了这样的思路。
#include<bits/stdc++.h>
using namespace std;
const int N = , mod = ;
int n, m, k, pre;
int dp[][N][N], f[][N][N];
char s[N], t[N];
int main()
{
scanf("%d%d%d%s%s", &n, &m, &k, s + , t + );
dp[][][] = ;
for(int i = ; i <= n; ++i)
{
pre ^= ;
dp[pre][][] = ;
for(int j = ; j <= min(m, i); ++j)
for(int x = ; x <= min(j, k); ++x)
{
dp[pre][j][x] = f[pre][j][x] = ;
if(s[i] == t[j])
f[pre][j][x] = (f[pre ^ ][j - ][x] + dp[pre ^ ][j - ][x - ]) % mod;
dp[pre][j][x] = (f[pre][j][x] + dp[pre ^ ][j][x]) % mod;
}
}
printf("%d\n", dp[pre][m][k]);
return ;
}
uoj#149的更多相关文章
- UOJ #149 [NOIP 2015] 子串
传送门 Solution DP+滚动数组. DP状态 \(dp[i][j][k]\): \(A\)的第\(i\)个字符和\(B\)的第\(j\)个字符匹配且该字符在第\(k\)个子串中的方案数. 转移 ...
- [NOIP2015提高组]子串
题目:洛谷P2679.Vijos P1982.codevs4560.UOJ#149. 题目大意:有长度为n的A串和长度为m的B串.现在要从A串中取出k个互不重叠的子串,使它们按顺序相连后得到B串.问有 ...
- 虚拟机上装uoj
前期准备: x64 ubuntu 镜像.vmware.ss账号 注意一定要有64位镜像! ss不是必须的,不过没有的话就等着下载一晚上吧... 首先先装好ubuntu,我装的是ubuntu-16.04 ...
- 【UOJ #35】后缀排序 后缀数组模板
http://uoj.ac/problem/35 以前做后缀数组的题直接粘模板...现在重新写一下模板 注意用来基数排序的数组一定要开到N. #include<cstdio> #inclu ...
- 【UOJ #246】【UER #7】套路
http://uoj.ac/contest/35/problem/246 神奇!我这辈子是想不出这样的算法了. 对区间长度分类讨论:题解很好的~ 我已经弱到爆了,看完题解后还想了一晚上. 题解中&qu ...
- 【UOJ #244】【UER #7】短路
http://uoj.ac/contest/35/problem/244 对其他人来说好简单的一道题,我当时却不会做TWT 注定滚粗啊 题解很好的~ #include<cstdio> #i ...
- 【BZOJ 3051】【UOJ #57】【WC 2013】平面图
http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...
- 【UOJ #13】【UER #1】跳蚤OS
http://uoj.ac/problem/13 建立trie树,然后建立go指针, 和AC自动机里的fail指针差不多, 走到一个快捷方式就从go指针走. 注意在trie树上要保留字符'/',不能用 ...
- 【UOJ #14】【UER #1】DZY Loves Graph
http://uoj.ac/problem/14 题解很好的~ 不带路径压缩的并查集能保留树的原本形态. 按秩合并并查集可以不用路径压缩,但是因为此题要删除,如果把深度当为秩的话不好更新秩的值,所以把 ...
随机推荐
- JS——冒泡排序
核心思想: 1.外层for循环控制比较的轮数 2.内层for循环控制每轮比较的次数 3.外层每进行一轮比较,内层就少一次比较,因为外层每进行一轮比较都会产生一个最大值 <script> v ...
- python读取单个文件操作
python读取单个文件,参考<笨方法学python>的第15节. 运行方式是采用:python python文件名 要读取的文件名 代码中 script, filename = argv ...
- CSS平滑过渡动画:transition
<html> <head> <link href="http://cdn.bootcss.com/twitter-bootstrap/3.0.2/css/boo ...
- python web 开发学习路线
转载,备着 自己目前学习python web 开发, 经过两个月的摸索,目前对web开发有了浅显的认识,把自己的学习过程贴出来.1.python入门推荐老齐<从零开始学python>,&l ...
- How an SSL connection is established
An SSL connection between a client and server is set up by a handshake, the goals of which are: To s ...
- vsftpd:500OOPS:vsftpd:refusingtorunwithwritablerootinsidechroot()错误的解决方法
当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误: 500 OOPS: vsftpd: refusing to run with writable root inside ...
- pandas操作,按序号取列,按条件筛选,df格式转换等
这几天遇到比较多的dataframe操作,频繁使用,在此整理记录下,方便查找. 1.num为列的数字序号,name=df.columns[num],返回的是column的字符串名字,df[name]= ...
- time模块和datatime模块
一.time模块 time.time() 获取时间戳 time.sleep() 睡几秒 time.gmtime() utc时间元组 time.localtime() 本地时间元组 time.mktim ...
- Heaters (codeforces 1066B)
贪心题 策略 在最左边设置一个array 0,每一次从右往左,如果有heater的话就寻找heater左边界是不是小于等于目前的上一个heater的右边界,如果没有一个这样的,那么就直接输出-1 代码 ...
- _initialize() 区别 __construct()
_initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initial ...