Daliy Algorithm (线性dp)-- day 68

Nothing to fear


种一棵树最好的时间是十年前,其次是现在!

那些你早出晚归付出的刻苦努力,你不想训练,当你觉的太累了但还是要咬牙坚持的时候,那就是在追逐梦想,不要在意终点有什么,要享受路途的过程,或许你不能成就梦想,但一定会有更伟大的事情随之而来。 mamba out~

人一我十, 人十我百,追逐青春的梦想,怀着自信的心,永不言弃!
2020.4.29


编辑距离

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>

using namespace std;
const int N = 2005;
char a[N] , b[N];
int f[N][N];
int main()
{
	scanf("%s %s",a + 1, b + 1);
	int n = strlen(a + 1),m = strlen(b + 1);
	for(int i = 0;i <= m ;i ++)f[0][i] = i;
	for(int j = 0;j <= n; j ++)f[j][0] = j;

	for(int i = 1;i <= n ;i ++)
	{
		for(int j = 1;j <= m ;j ++)
		{
			// 增加
			f[i][j] = min(f[i][j-1] + 1,f[i-1][j] + 1);
			// 改
			f[i][j] = min(f[i][j],f[i-1][j-1] + (a[i] != b[j]));
		}
	}
	cout << f[n][m] << endl;
	return 0;
}

LCS

常规版

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;

const int N = 1005;
int f[N][N];
char a[N], b[N];
int main()
{
	int n , m;
	cin >> n >> m;
	scanf("%s %s",a + 1, b + 1);

	for(int i = 1;i <= n ;i ++)
	{
		for(int j = 1;j <= m ;j ++)
		{
			if(a[i] == b[j])
			{
				f[i][j] = max(f[i][j],f[i-1][j-1] + 1);
			}else f[i][j] = max(f[i-1][j],f[i][j-1]); // 继承
		}
	}
	cout << f[n][m] << endl;
	return 0; 
}
posted @ 2020-04-29 23:25  _starsky  阅读(99)  评论(0)    收藏  举报