P2679 子串

來源:互聯網
上載者:User

標籤:最佳化   etc   lan   ref   ace   也有   滾動   stream   inline   

傳送門

十分顯然的DP

設 f [ i ] [ j ] [ k ] [ 1/0 ] 表示當前考慮到 A 串第 i 位,匹配到 B 串第 j 位,已經劃分了 k 分,當前為 選 or 不選

如果 A [ i ] ≠ B [ j ] 那麼當前位不能選,則只有一個轉移 f [ i ] [ j ] [ k ] [ 0 ] = f [ i-1 ] [ j ] [ k ] [ 0 ] + f [ i-1 ] [ j ] [ k ] [ 1 ]

如果 A [ i ] = B [ j ] 那麼可以考慮選擇當前位,就多了一個轉移

f [ i ] [ j ] [ k ] [ 1 ] = f [ i-1 ] [ j-1 ] [ k-1 ] [ 0 ] + f [ i-1 ] [ j-1 ] [ k ] [ 1 ] + f [ i-1 ] [ j-1 ] [ k-1 ] [ 1 ]

注意轉移時如果上一位也有選,那麼當前位可以與上一位合并也可以不合并,單獨分出一位

注意空間完全不夠,所以要滾動數組最佳化掉 i 

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;typedef long long ll;inline int read(){    int x=0,f=1; char ch=getchar();    while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f=-1; ch=getchar(); }    while(ch>=‘0‘&&ch<=‘9‘) { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }    return x*f;}const int N=1007,M=207,mo=1e9+7;inline int fk(int x) { return x>=mo ? x-mo : x; }//這樣取餘比較快int n,m,t;char sa[N],sb[M];int f[2][M][M][2];int main(){    n=read(); m=read(); t=read();    scanf("%s",sa+1); scanf("%s",sb+1);    f[0][0][0][0]=1;    for(int i=1;i<=n;i++)        for(int j=0;j<=m;j++)            for(int k=0;k<=t;k++)            {                f[i&1][j][k][0]=fk( f[(i-1)&1][j][k][0]+f[(i-1)&1][j][k][1] );                if(j&&k&&sa[i]==sb[j])//要注意此時j,k不能為0                    f[i&1][j][k][1]=fk( f[(i-1)&1][j-1][k][1]+ fk(f[(i-1)&1][j-1][k-1][0]+f[(i-1)&1][j-1][k-1][1]) );                else f[i&1][j][k][1]=0;//因為是滾動數組,所以注意如果不能選一定要記得把值賦為0            }    printf("%d",fk( f[n&1][m][t][0]+f[n&1][m][t][1] ));    return 0;}

 

P2679 子串

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.