杨泽彬的神秘商店

博客园 首页 新随笔 联系 订阅 管理

主要参考:牛客上分享的帖子以及力扣第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数组的含义才能进行动态规划。

posted on 2022-08-20 20:02  快乐过了阈值  阅读(62)  评论(0编辑  收藏  举报