版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/88095953
枚举起始位置,然后向后面贪心匹配,因为T是S的子串,所以从前往后以此判断当前的T[i]是否等于当前的S[i],如果不等则直接加上T[i]的代价加入除了当前字符以外的字符是没有意义的,如果相等则下一个。
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int dp[maxn][maxn/2];
int cost[128];
string s,t;
int main()
{
cin>>s>>t;
cin>>cost['A']>>cost['C']>>cost['G']>>cost['T'];
for(int i=1;i<=t.size();i++)
dp[0][i]=dp[0][i-1]+cost[t[i-1]];
for(int i=1;i<=s.size();i++)
{
for(int j=1;j<=t.size();j++)
{
if(s[i-1]!=t[j-1])
dp[i][j]=dp[i][j-1]+cost[t[j-1]];
else
dp[i][j]=min(dp[i-1][j-1],dp[i][j-1]+cost[t[j-1]]);
}
}
int ans=INT_MAX;
for(int i=1;i<=s.size();i++)
ans=min(ans,dp[i][t.size()]);
cout<<ans<<endl;
return 0;
}