【uoj#149】【NOIP2015】子串 DP
来源:互联网 发布:淘宝怎么编辑宝贝详情 编辑:程序博客网 时间:2024/06/06 00:51
uoj复制好像能放大的都复制两遍…直接丢链接吧:#149. 【NOIP2015】子串
题意是说给你一个a串一个b串,从a串中挑出k个互不重叠的子串按顺序连接使得得到的串和b串一样…
OI生涯中直到现在最惨痛的经历,除了运输计划没有之一…这题我以为string慢,把30分骗分给我卡到10分…不想说什么了……
说正解。设
然后开始用最长公共子序列的想法去想:
当
一个个解释一下:
对于第一个式子,因为当前两字符相同,有两种情况:要么这个字符自己占一个子串(
对于第二个式子,匹配到第i个字符总的方案数就是没选到第i个字符(上一阶段)的总方案数(
然后对于
第二个式子显然,第一个式子因为第i个字符没贡献所以直接继承上一阶段的方案数。
然后现在dp方程就有了:
答案是
然而会爆空间。
//卧槽这题还有完没完了
跟优化01背包的思路一样,可以把第一维优化掉,把j和k的顺序倒序for就行了。
这题dp真丧病…
优化前(爆空间):
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int SZ = 1000010;const int mod = 1000000007;int n,m,K;char a[SZ],b[SZ];int dp[1010][210][210][2];int DP(){ dp[0][0][0][0] = 1; for(int i = 1;i <= n;i ++) { dp[i][0][0][0] = 1; for(int j = 1;j <= m;j ++) { for(int k = 1;k <= K;k ++) { if(a[i] == b[j]) { dp[i][j][k][1] = (dp[i - 1][j - 1][k - 1][0] + dp[i - 1][j - 1][k][1]) % mod; dp[i][j][k][0] = (dp[i - 1][j][k][0] + dp[i][j][k][1]) % mod; } else dp[i][j][k][0] = dp[i - 1][j][k][0]; } } } return dp[n][m][K][0];}int main(){ freopen("substring.in","r",stdin); freopen("substring.out","w",stdout); scanf("%d%d%d%s%s",&n,&m,&K,a + 1,b + 1); printf("%d",DP()); return 0;}
优化后:
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int SZ = 1000010;const int mod = 1000000007;int n,m,K;char a[SZ],b[SZ];int dp[210][210][2];int DP(){ dp[0][0][0] = 1; for(int i = 1;i <= n;i ++) { for(int j = m;j >= 1;j --) { for(int k = K;k >= 1;k --) { if(a[i] == b[j]) { dp[j][k][1] = (dp[j - 1][k - 1][0] + dp[j - 1][k][1]) % mod; dp[j][k][0] = (dp[j][k][0] + dp[j][k][1]) % mod; } else dp[j][k][1] = 0; } } } return dp[m][K][0];}int main(){ scanf("%d%d%d%s%s",&n,&m,&K,a + 1,b + 1); printf("%d",DP()); return 0;}
0 0
- 【uoj#149】【NOIP2015】子串 DP
- 【UOJ#149】【NOIP2015】子串【计数DP】
- [UOJ#149][NOIP2015]子串(dp)
- 【DP】UOJ#149 【NOIP2015】子串
- 【noip2015】【DP】子串
- NOIP2015 子串 DP
- noip2015 子串 dp
- NOIP2015 子串 dp
- [DP] NOIP2015 子串
- [noip2015]子串(dp)
- NOIP2015 子串【DP】【NOIP】
- UOJ 149 子串
- NOIP2015 子串 解题报告(DP)
- Noip2015 Day1 T2 子串(Dp)
- 洛谷 2676 [NOIP2015] 子串 DP
- UOJ149【NOIP2015】子串 (DP)
- [NOIP2015提高组]子串 DP
- code vs 4560 NOIP2015 D2T2 子串 (dp)
- 深入研究java.lang.Class类
- lua-使用外部模块
- Google 图片搜索的原理是什么?
- Android开发中一些被冷落但却很有用的类和方法
- js中,销魂的this
- 【uoj#149】【NOIP2015】子串 DP
- winser2008设置远程连接,并更换端口
- 《广告人》专访有米叶文胜:跨维营销之实践
- 笔记
- LVS负载均衡器DR模型的实现
- /**倒计时计时器**/
- String.format();
- Linux防御小规模的DDoS攻击
- aidl深度解析