20172018-acmicpc-southeastern-european-regional-programming-contest-seerc-2017-en A - Concerts

  題意就是給一個字母序列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
*/
相關文章
相關標籤/搜索