现在的位置: 首页 > 综合 > 正文

UVA 11081 Strings

2019年04月06日 ⁄ 综合 ⁄ 共 1024字 ⁄ 字号 评论关闭

大意略。

思路:这个DP说实话真的很难思考,根本无从下手的感觉,参考了该论文

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;

const int MAXN = 72;

int f[MAXN][MAXN][MAXN], f1[MAXN][MAXN][MAXN], f2[MAXN][MAXN][MAXN];
char str1[MAXN], str2[MAXN], str3[MAXN];

void init()
{
	memset(f, 0, sizeof(f));
	memset(f1, 0, sizeof(f1));
	memset(f2, 0, sizeof(f2));
}

void read_case()
{
	init();
	scanf("%s%s%s", str1+1, str2+1, str3+1);
}

int dp()
{
	int len1 = strlen(str1+1), len2 = strlen(str2+1), len3 = strlen(str3+1);
	for(int i = 0; i <= len1; i++)
	{
		for(int j = 0; j <= len2; j++)
		{
			f[0][i][j] = f1[0][i][j] = f2[0][i][j] = 1;
		}
	}
	for(int i = 1; i <= len3; i++)
	{
		for(int j = 0; j <= len1; j++)
		{
			for(int k = 0; k <= len2; k++)
			{
				if(j)
				{
					f1[i][j][k] = f1[i][j-1][k];
					if(str1[j] == str3[i]) f1[i][j][k] += f[i-1][j-1][k];
					f1[i][j][k] %= 10007;
				}
				if(k)
				{
					f2[i][j][k] = f2[i][j][k-1];
					if(str2[k] == str3[i]) f2[i][j][k] += f[i-1][j][k-1];
					f2[i][j][k] %= 10007;
				}
				f[i][j][k] = (f1[i][j][k] + f2[i][j][k]) % 10007;
			}
		}
	}
	return f[len3][len1][len2] % 10007;
}

void solve()
{
	read_case();
	int ans = dp();
	printf("%d\n", ans);
}

int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		solve();
	}
	return 0;
}

抱歉!评论已关闭.