String Painter hdu2476 区间dp
作者:
多米尼克領主的致意
,
2024-04-23 16:38:33
,
所有人可见
,
阅读 3
dp[i][j]定义 在区间i,j内将空字符串转换到B所需要的操作次数
分成两步
1.将空字符串 变为 B串 做dp
2.从A串到B串dp 其中当a[i] != b[i] 的时候 f[1][i] = f[1][k] + f[k + 1][i]
等式的右端的左式表示之前的已经被粉刷相同 右式则是等同于从空字符串变成B串的大小。
若是相同的字符串 会在第二模块中 在f[1][i] = f[1][i - 1]时置零
不相同的字符 则由A变为B和 空字符串变为B操作次数等价
代码:
#include<bits/stdc++.h>
using namespace std;
char a[110];
char b[110];
int f[110][110];
int mx;
int INF = 0x3f3f3f3f;
int main()
{
// ios::sync_with_stdio(0);
// cin.tie(0);
// cout.tie(0);
while(~scanf("%s%s", a + 1, b + 1))
{
int mx = strlen(a + 1);
// memset(f, 0x3f, sizeof f);
for(int i = 0;i <= mx;i++)
{
f[i][i] = 1;
}
//由空字符串 -> B字符串
for(int len = 2;len <= mx;len++)
{
for(int i = 1;i + len -1 <= mx;i++)
{
int j = i + len - 1;
f[i][j] = INF;
if(b[i] == b[j])f[i][j] = f[i][j - 1];
else{
for(int k = i; k < j; k++)
{
f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
}
}
}
}
for(int i = 1;i <= mx;i++)
{
if(a[i] == b[i])f[1][i] = f[1][i - 1];
else{
for(int k = 1;k < i;k++)
{
f[1][i] = min(f[1][i], f[1][k] + f[k + 1][i]);
}
}
}
cout << f[1][mx] << endl;
}
return 0;
}