#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const double eps = 1e-5;
const int N = 1e2 + 10;
const int mod = 10007;
int dp[N][N];
/*
先用一个空串全部转换为b,dp(l,r) = dp(l,r - 1) + 1.
枚举断点,当前满足p(k) == p(r)
dp(l,r) = min(dp(l,k)+ dp(k+1,r-1),dp(l,r))。
之后再将a转换为b,如果当前a串和b串的这位相同,则这一位可以不用被改变,
即 dp(1,k) = min(dp(1,i-1) + dp(i+1,k).... )
*/
signed main(){
IOS
string s,p;
while(cin>>s>>p){
memset(dp,0,sizeof(dp));
int n = (int)s.size();
for(int i=1;i<=n;i++) dp[i][i] = 1;
for(int len=2;len<=n;len++)
for(int l=1;l<=n-len+1;l++){
int r = l + len - 1;
dp[l][r] = dp[l][r-1] + 1;
for(int k=l;k<r;k++)
if(p[k-1] == p[r-1])
dp[l][r] = min(dp[l][r],dp[l][k]+dp[k+1][r-1]);
}
for(int i=1;i<=n;i++)
if(s[i-1] == p[i-1])
for(int k=i;k<=n;k++)
dp[1][k] = min(dp[1][i-1]+dp[i+1][k],dp[1][k]);
cout<<dp[1][n]<<endl;
}
return 0;
}
String painter(HDU2476)(区间DP)
最新推荐文章于 2023-09-26 17:17:22 发布