区间dp问题 字串变换
hdu2476,区间dp新手遇到的感觉比较有意思的题,记录一下。
这里也遇到了区间dp常见以区间最左端位置为特殊位置进行考虑的情况。
//
// Created by SANZONG on 2020/11/1.
//
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <cmath>
#include <bitset>
#include <map>
using namespace std;
int num[101];
int dp[800][800];
int ans[101];
int main()
{
string s1;
string s2;
while (cin >> s1 >> s2)
{
memset(ans,0,sizeof(ans));
for(int i = 0;i < s1.length();i++) //打出每个位置需要变的最小步数
{
for(int j = i ;j >= 0;j--)
{
dp[j][i] = 0x3f3f;
dp[j][i] = min(dp[j][i],dp[j+1][i]+1);
for (int k = j+1; k <= i; ++k) {
if(s2[k] == s2[j])
{
dp[j][i] = min(dp[j][i],dp[j+1][k]+dp[k+1][i]); // 此处不能break;必须找到最小
}
}
}
}
if(s1[0] == s2[0]) //以s1为模板,得出s2与s1不同的字串,对不同的部分进行一个步数统计
ans[0] = 0;
else
ans[0] = 1;
for (int i = 1; i < s1.length(); ++i) {
ans[i] = dp[0][i];
if(s1[i] == s2[i])
ans[i] = ans[i-1];
else{
int k;
for(k=0;k<i;k++)
ans[i]=min(ans[i],ans[k]+dp[k+1][i]);
}
}
cout << ans[s1.length()-1] << endl;
}
}