NOIP2015 子串
来源:互联网 发布:淘宝手机充值卡换现金 编辑:程序博客网 时间:2024/05/16 14:38
NOIP2015子串
题面:点击查看
题解
雏形
用
设计状态:
伪代码
for(k=1 to K) for(i=1 to N) for(j=1 to M) for(l=1 to len[i][j]) for(t=1 to l) f[i][j][k]+=f[t][l][k-1]
上述的时间复杂度在最差情况下是
优化
观察方程
如果把f数组想象成三维坐标系中的一些坐标为整数的点,那么每一个与k轴垂直的平面的转移都只需要用到前一个平面上的值,所以可以加一个滚动数组,这样就能把空间复杂度降到
继续,由于
那么状态转移方程变为
其中由于s数组是前缀和,所以直接用
按照联赛的数据,这样是可以AC的,但是这样并不完美,如果有一种数据把nmk都开到最大,并且字符串形如
决定性的优化:前缀和的前缀和
根据上面的方程,仍然发现
这个也可以用递推式在
最后的状态转移方程:
最后的时间复杂度
刻骨铭心的教训
这道题我其实只用了一小会就写出正解了,但是由于没看到“输出答案对1,000,000,007取模的结果”竟然查错查了一上午!
代码
//NOIP2015 子串 动态规划 #include <cstdio>#include <algorithm>#define p 1000000007#define ll long long#define maxn 1010#define maxm 210using namespace std;ll f[maxn][maxm][2], s[maxn][maxm][2], ss[maxn][maxm][2], len[maxn][maxm], N, M, K;char a[maxn]={0}, b[maxm]={1};void init(){ ll i, j, l; scanf("%lld%lld%lld%s%s",&N,&M,&K,a+1,b+1); for(i=1;i<=N;i++) for(j=1;j<=M;j++) for(l=1;a[i-l+1]==b[j-l+1];len[i][j]=l++);}void dp(){ ll i, j, k; for(i=1;i<=N;i++) for(j=1;j<=M;j++) { f[i][j][1]=len[i][j]==j; s[i][j][1]=s[i-1][j][1]+f[i][j][1]; ss[i][j][1]=ss[i-1][j-1][1]+s[i][j][1]; } for(k=2;k<=K;k++) { for(i=1;i<=N;i++) for(j=1;j<=M;j++) { f[i][j][k&1]=(ss[i-1][j-1][~k&1]-ss[max((ll)0,i-len[i][j]-1)][max((ll)0,j-len[i][j]-1)][~k&1])%p; s[i][j][k&1]=(s[i-1][j][k&1]+f[i][j][k&1])%p; ss[i][j][k&1]=(ss[i-1][j-1][k&1]+s[i][j][k&1])%p; } }}int main(){ ll i, ans; init(); dp(); for(i=M,ans=0;i<=N;ans=(ans+f[i++][M][K&1])%p); printf("%lld\n",(ans+p)%p); return 0;}
0 0
- 【NOIP2015】子串
- NOIP2015 day2t2 子串
- 【NOIP2015】子串
- NOIP2015 子串
- 【noip2015】【DP】子串
- NOIP2015 子串 DP
- NOIP2015子串
- noip2015 子串 dp
- NOIP2015子串
- NOIP2015 day2t2 子串
- NOIP2015 子串 dp
- [NOIP2015]Day2T2 子串
- NOIP2015子串题解
- luogu2679 noip2015 子串
- 【NOIP2015】子串
- [DP] NOIP2015 子串
- [noip2015]子串 题解
- NOIP2015 子串
- if elseif elseif elseif else...
- jQuery常见知识要点
- 基于Opencv2.4.11+OpenGL(Qt5.6.0)实现增强现实(二)
- 基于workerman的聊天室
- html5 存储详解
- NOIP2015 子串
- Visualforceタグ
- [ZJOI2008]泡泡堂
- 大型网站架构技能图谱(Java版)
- 红茶一杯话Binder(传输机制篇_中)
- CocoaPods - pod install ,pod update的用法
- 常用 MySQL 修改表结构命令
- 如何修改MySQL的密码?
- Leetcode 114. Flatten Binary Tree to Linked List 二叉树到链表 解题报告