zoukankan      html  css  js  c++  java
  • P2679 子串

    链接:Miku


    (dp_{i,j,k,0/1})表示A串

    应该

    取i,j个的时候的方案数

    然后要考虑的就是

    如果(a_{i-1})==(b_{j-1})

    那么(dp_{i,j,k,1})=(dp_{i-1,j-1,k,1})+(dp_{i-1,j-1,k-1,1})+(dp_{i-1,j-1,k-1,0})
    //其实也就是拼到原来的上,在原来的后面强拆一个,正常的新建一个
    反之 (dp_{i,j,k,1})=0;

    然后对于所有的(dp_{i,j,k,0})=(dp_{i-1,j,k,1})+(dp_{i-1,j,k,0})

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int n,m,k,z;
    string a,b;
    //用char会有奇怪的格式问题
    int f[2][1001][300][2];
    int mod=1000000007;
    int main(){
    	scanf("%d%d%d",&n,&m,&z);
    	cin>>a>>b;
    //	cout<<a[0];
    	f[1][0][0][0]=f[0][0][0][0]=1;
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=m;++j){
    			for(int k=1;k<=z;++k){
    				if(a[i-1]==b[j-1]){
    					f[i%2][j][k][1]=((f[(i+1)%2][(j-1)][k][1]+f[(i+1)%2][(j-1)][k-1][1])%mod+f[(i+1)%2][(j-1)][k-1][0])%mod;
    					f[i%2][j][k][0]=(f[(i+1)%2][j][k][1]+f[(i+1)%2][j][k][0])%mod;
    				}else{
    					f[i%2][j][k][1]=0;
    					f[i%2][j][k][0]=(f[(i+1)%2][j][k][1]+f[(i+1)%2][j][k][0])%mod;
    				} 
    			}
    		}
    	}
    	cout<<(f[(n)%2][m][z][0]+f[(n)%2][m][z][1])%mod;
    	return 0;
    } 
    
  • 相关阅读:
    mac,使用jadx,apktool,反编译apk,打包apk,签名,阅读smali文件
    对安卓逆向的认识
    js逆向答疑
    js-15:js逆向总结
    对js逆向的认识
    开发工具使用技巧-pycharm-mac
    ES6的新特性
    js-BOM操作
    js-DOM操作
    js-ECMAScript-6:自定义对象
  • 原文地址:https://www.cnblogs.com/For-Miku/p/13697752.html
Copyright © 2011-2022 走看看