您的位置:首页 > 其它

动态规划交错匹配问题

2016-05-16 15:26 477 查看

题目



题目分析

对动态规划题目的理解不是特别深,所以看了别人的博客进行学习,给出博客地址交错匹配博客,说的非常好也非常详细,但是预处理写的不是很好,我用自己想到的思路写了出来,清晰明白一点。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 2005;
int a[maxn],b[maxn];
int dp1[maxn][maxn],dp2[maxn][maxn],f[maxn][maxn];

void init(int n,int m)
{
memset(dp1, 0, sizeof(dp1));
memset(dp2, 0, sizeof(dp2));
for(int i = 1; i <= n; i++)  //dp1存储a列前i个数和b列前j个元素中,最靠近j的位置且等于a[i]的元素位置
{
for(int j = 2; j <= m; j++)
{
if(a[i] == b[j-1])
dp1[i][j] = j-1;
else
dp1[i][j] = dp1[i][j-1];
}
}
for(int j = 1; j <= m; j++) //dp2存储a列前i个数和b列前j个元素中,最靠近i的位置且等于b[j]的元素位置
{
for(int i = 2; i <= n; i++)
{
if(b[j] == a[i-1])
dp2[i][j] = i-1;
else
dp2[i][j] = dp2[i-1][j];
}
}
}

int main()
{
int n,m;
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for(int j = 1; j <= m; j++)
scanf("%d", &b[j]);
init(n, m);
memset(f, 0, sizeof(f));
for(int i = 2; i <= n; i++)
{
for(int j = 2; j <= m; j++)
{
f[i][j] = f[i-1][j-1];   //i和j都不参加匹配
f[i][j] = max(f[i][j], f[i-1][j]); //i不参加匹配
f[i][j] = max(f[i][j], f[i][j-1]); //j不参加匹配
if(a[i] != b[j])                   //前面有能匹配的数,同时找到的是离i,j最近的,因为这样一定是最优的
{
int ip = dp2[i][j],jp = dp1[i][j];
if(ip && jp)
f[i][j] = max(f[i][j], f[ip-1][jp-1] + 2);
}
}
}
printf("%d\n", f
[m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: