題意就是給一個字母序列a,以及一個另一個字母序列b,你須要b中找到字母序列a,而且要求對於在b中的字母序列a,每一個單詞都須要知足相應的距離 ios
其實很簡單,咱們利用DP[i][j]表明a已經匹配i個位置,當前是在b串的j位置,這樣咱們很容易寫出轉移方程spa
dp[ i ] [ j ] +=dp[ i-1 ] [ j - time[ i ] -1] code
dp[ i ] [ j ] +=dp[ i-1 ] [ j ] blog
第一個式子的意思是第 i 個位置匹配成功,是由第 i - 1匹配成功,而且減去a[i-1]所須要的時間,轉移而來。string
第二個式子是咱們爲了獲得前面能知足的狀態,須要把前面的狀態保存起來。it
#include<iostream> #include<string.h> #include<algorithm> #include<stdio.h> #define LL long long const int maxx = 1e5+6; const int MOD =1e9+7; using namespace std; int dp[305][maxx]; int k,n; int word[maxx]; char b[maxx]; char a[305]; int main(){ while(~scanf("%d%d",&k,&n)){ for (int i=1;i<=26;i++){ scanf("%d",&word[i]); } scanf("%s",a+1); scanf("%s",b+1); for (int i=1;i<=n;i++){ if (b[i]==a[1]){ dp[1][i]=1; } } for (int i=1;i<=k;i++){ for (int j=1;j<=n;j++){ if (a[i]==b[j]){ int t=a[i-1]-'A'+1; if (j-word[t]-1>=1) dp[i][j]=(dp[i][j]+dp[i-1][j-word[t]-1])%MOD; } dp[i][j]=(dp[i][j]+dp[i][j-1])%MOD; } } LL ans=0; printf("%d\n",dp[k][n]); } return 0; } /* 2 10 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 AB ABBBBABBBB */