很久没写 dp,使得比赛时明知是dp却不敢写。。。特别特别懊悔。。。比赛时的题目就是这题原版覆过来的,长度变为2000
题意:给你三个字符串,问你前两个是否能组成第三个串,串中字符顺序不可改变,可拆分。
思路:简单的dp写法,用一个二维数组,第一维代表第一个字符串用了前几位,第二维代表第二个字符串用了前几位,若 dp[i][j] 可以组成 str[i+j]之前的所有字符,则为1,否为0。
例子: abc def adebcf
dp为1的状态都有: dp[1][0] = 1; 取str1[0]
dp[1][1] = 1; 在dp[1][0]的基础上再取str2[0],以此类推
dp[1][2] = 1;
dp[2][2] = 1;
dp[3][2] = 1;
dp[3][3] = 1;
代码实现:
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
using namespace std;
char str1[440], str2[440], str[440];
int dp[440][440];
int main()
{
int T;
scanf("%d", &T);
for(int k = 0; k < T; k++)
{
scanf("%s%s%s", str1, str2, str);
int len1 = strlen(str1);
int len2 = strlen(str2);
int len = strlen(str);
printf("Data set %d: ", k+1);
if(len != len1 + len2)
{
printf("no\n");
continue;
}
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i = 0; i <= len1; i++)
{
for(int j = 0; j <= len2; j++)
{
if(i == 0 && j == 0) continue;
if(i != 0 && dp[i-1][j] == 1 && str1[i-1] == str[i+j-1])
{
dp[i][j] = 1;
continue;
}
if(j != 0 && dp[i][j-1] == 1 && str2[j-1] == str[i+j-1])
dp[i][j] = 1;
}
}
if(dp[len1][len2] == 1) printf("yes\n");
else printf("no\n");
}
return 0;
}
若有错,请多多指教^ ^