区间DP HDU 2476

时间:2023-03-10 02:04:11
区间DP HDU 2476

两个字符串s1,s2

从s1->s2

最少刷几次

刷 i->j 都变成一样的+1

 #include<stdio.h>
#include<string.h> using namespace std;
#define MAXN 110 int dp[MAXN][MAXN];
char s1[MAXN],s2[MAXN];
int ans[MAXN];
int min1(int a,int b)
{
return a>b?b:a;
}
int main()
{ while(scanf("%s%s",s1,s2)!=EOF)
{
memset(ans,,sizeof(ans));
memset(dp ,,sizeof(dp));
int n=strlen(s1);
int len,i,j,k;
for(i=;i<n;i++)dp[i][i]=; 刷n次 肯定是对的 for(len=;len<=n;len++) //由短到长
{
for(i=;i<n-len+;i++)
{
j=i+len-;
dp[i][j]=dp[i+][j]+; //加一次 肯定是对的
for(k=i+;k<=j;k++)
{
if(s2[i]==s2[k])
dp[i][j]=min1(dp[i][j],dp[i+][k]+dp[k+][j]);
}
}
}
for(i=;i<n;i++)
ans[i]=dp[][i]; //0->i刷几次
for(i=;i<n;i++)
{
if(s1[i]==s2[i])
{
if(i==)ans[i]=;
else ans[i]=ans[i-];
}
else
{
for(j=;j<i;j++)
ans[i]=min1(ans[i],ans[j]+dp[j+][i]);
}
}
printf("%d\n",ans[n-]); }
return ;
}