主要参考:牛客上分享的帖子以及力扣第72题编辑距离的题解
首先用动态规划做是最合适的
阶段:对A操作i次,对B操作j次
确定dp数组的含义:从数组A【0-i】到与数组B【0-j】保持一致所需要的操作次数
dp[i][j]
初始化: dp[i][0] : 从数组A【0-i】到与数组B【0】保持一致所需要的最小操作时间 即每次都只需要操作A【i】,dp[i][0]=dp[i-1][0]+abs(A[i-1]);
dp[0][j]: 从数组A【0-i】到与数组B【0】保持一致所需要的最小操作时间 即每次都只需要操作B【i】,dp[0][j]=dp[0][j-1]+abs(B[j-1]);
最终代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<int> a,b;
int n,m,max;
cin >> n;
cin >> m;
for(int i = 0; i<n;i++)
{
int tmp = 0;
cin >> tmp;
a.push_back(tmp);
}
for(int i = 0; i<m;i++)
{
int tmp = 0;
cin >> tmp;
b.push_back(tmp);
}
vector<vector<int>> dp(n+1,vector<int>(m+1,0));
for(int i = 1;i<n+1;i++)
{
dp[i][0] = dp[i-1][0]+ abs(a[i-1]);
}
for(int j = 1;j<m+1;j++)
{
dp[0][j] = dp[0][j-1]+ abs(b[j-1]);
}
for(int i = 1;i<n+1;i++)
{
for(int j=1;j<m+1;j++)
{
if(a[i-1]==b[j-1]) dp[i][j] = dp[i][j];
else
{
dp[i][j]= min(dp[i-1][j]+abs(a[i-1]),min(dp[i][j-1]+abs(b[j-1]),dp[i-1][j-1]+abs(a[i-1]-b[j-1])));
}
}
}
cout << dp[n][m] <<endl;
return 0;
}
看完大神的解释和自己写一遍之后又更加理解dp数组与存储数据的数组不是一个东西。
一定要先明确dp数组的含义才能进行动态规划。