NOIP2015 day2t2 子串
2017-07-01 20:59
232 查看
NOIP2015 day2t2 子串
懒得写标题懒得写题解,改天再补,破题调天。
先贴代码
附一点变量的意思凑合着看吧= =
codevs 137ms
变量lena,lenb的意思是a,b字符串的长度,a是那个较长串,b是短的
dp数组本来应该是如下,为了避免高位寻址,把第四位换到了第二维
dp[0/1][lenb][k][0/1],其中第一维是滚动数组(不然会MLE),work函数里的t就是滚动,第二维指当前已经获取了b串的b[1]~b[j],即获取到了第j位,第三维指当前已经提取了k个子串。
第四维表示:
对于a串,在判断时,a[i]是否等于b[j],也可以理解为是否选取当前这个数字。
work里面的o,option,选择子串个数。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int lena,lenb,k; int dp[2][2][202][202],t=0; char a[1005],b[205]; void work(){ dp[0][0][0][0]=dp[1][0][0][0]=1; for(int i=1;i<=lena;i++){ t=1-t; for(int j=1;j<=i&&j<=lenb;j++) for(int o=1;o<=k&&o<=j;o++){ if(a[i]==b[j]) dp[t][1][j][o]=(int )(((long long )dp[t^1][0][j-1][o-1]+dp[t^1][1][j-1][o-1]+dp[t^1][1][j-1][o])%1000000007); else dp[t][1][j][o]=0; dp[t][0][j][o]=(dp[t^1][1][j][o]+dp[t^1][0][j][o])%1000000007; } } } int main(){ scanf("%d%d%d",&lena,&lenb,&k);getchar(); scanf("%s",a+1);getchar(); scanf("%s",b+1); work(); printf("%d",(dp[t][1][lenb][k]+dp[t][0][lenb][k])%1000000007); return 0; }
相关文章推荐
- NOIP2015 day2t2 子串
- [NOIP2015]Day2T2 子串
- [NOIP2015] 提高组 洛谷P2679 子串
- 【NOIP2015提高组T5】子串-字符串上的动态规划
- NOIP2015子串题解
- noip2015 子串
- NOIP 2015 Day 2 substring 子串(字符串 dp)
- noip2015 子串(心得体会)
- 【NOIP】提高组2015 子串
- 【NOIP2015-Day2-T2】洛谷2679:子串 题解
- 洛谷 P2679 [NOIP2015 D2T2] 子串
- NOIP2015 子串
- NOIP2015 子串
- NOIP2015 子串 dp
- NOIP2015 子串 DP
- [NOIp 2015]子串
- [UOJ#149][NOIP2015]子串(dp)
- 【NOIP2015提高组Day2】子串
- Noip 2015 D2T2 子串(动态规划)
- [DP] NOIP2015 子串