您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: