点击打开链接

描述
Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.



For example, consider forming "tcraete" from "cat" and "tree":



String A: cat

String B: tree

String C: tcraete



As you can see, we can form the third string by alternating characters from the two strings. As a second example, consider forming "catrtee" from "cat" and "tree":



String A: cat

String B: tree

String C: catrtee



Finally, notice that it is impossible to form "cttaree" from "cat" and "tree".
输入
The first line of input contains a single positive integer from 1 through 1000. It represents the number of data sets to follow. The processing for each data set is identical. The data sets appear on the following lines, one data set per line.



For each data set, the line of input consists of three strings, separated by a single space. All strings are composed of upper and lower case letters only. The length of the third string is always the sum of the lengths of the first two strings. The first two
strings will have lengths between 1 and 200 characters, inclusive.
输出
For each data set, print:



Data set n: yes



if the third string can be formed from the first two, or



Data set n: no



if it cannot. Of course n should be replaced by the data set number. See the sample output below for an example.
样例输入
3
cat tree tcraete
cat tree catrtee
cat tree cttaree
样例输出
Data set 1: yes
Data set 2: yes
Data set 3: no
来源
Pacific Northwest 2004

花了好长时间终于用动态规划的方法把样例输入的结果给弄对,但是提交的时候却是WA,后来看了别人的代码发现好多都是用记忆化搜索来做的

AC代码

源代码

#include <stdio.h>
#include <string.h> int main()
{
int i, j, k, t;
int L1, L2, ok[202][202];
char str1[201], str2[201], str3[402];
/**********************
ok[i][j]为真时表示str1的前i个字符可以和str2的前j个字符
组成str3的前i+j个字符。为假时 表示不能。
***********************/ scanf("%d", &t);
for (i=1; i<=t; i++)
{
scanf("%s %s %s", str1, str2, str3);
memset(ok, 0, sizeof(ok));
L1 = strlen(str1);
L2 = strlen(str2); ok[0][0] = 1;
for (j=1; j<=L1; j++)
{
if (ok[j-1][0] == 1 && str1[j-1] == str3[j-1])
ok[j][0] = 1;
else
break;
}
for (j=1; j<=L2; j++)
{
if (ok[0][j-1] == 1 && str2[j-1] == str3[j-1])
ok[0][j] = 1;
else
break;
}
for (j=1; j<=L1; j++)
{
for (k=1; k<=L2; k++)
{
if (ok[j-1][k]==1 && str1[j-1]==str3[j+k-1] || ok[j][k-1]==1 && str2[k-1]==str3[j+k-1])
ok[j][k] = 1;
}
}
if (ok[L1][L2] == 1)
printf("Data set %d: yes\n", i);
else
printf("Data set %d: no\n", i);
}
}

WA代码

源代码

#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<iostream> using namespace std;
char strr1[1010];
char strr2[1010];
char strr3[1010];
int maxLen[1010][1010];
int main()
{
int n;
scanf("%d",&n);
for(int w=1; w<=n; w++)
{
scanf("%s %s %s",&strr1,&strr2,&strr3);
int length1=strlen(strr1);
int length2=strlen(strr2);
int length3=strlen(strr3);
int nTmp;
// int i,j,k;
memset(maxLen,0,sizeof(maxLen));
for(int i=0; i<=length1; i++)
{
maxLen[i][0]=0;
}
for(int k=0; k<=length3; k++)
{
maxLen[0][k]=0;
}
for(int i=1; i<=length1; i++)
{
for(int k=1; k<=length3; k++)
{
if(strr1[i-1]==strr3[k-1])
maxLen[i][k]=maxLen[i-1][k-1]+1;
else
maxLen[i][k]=max(maxLen[i-1][k],maxLen[i][k-1]);
}
}
if(maxLen[length1][length3]==length1)
{
memset(maxLen,0,sizeof(maxLen)); for(int j=0; j<length2; j++)
{
maxLen[j][0]=0;
} for(int k=0; k<length3; k++)
{
maxLen[0][k]=0;
} for(int j=1; j<=length2; j++)
{
for(int k=1; k<=length3; k++)
{
if(strr2[j-1]==strr3[k-1])
maxLen[j][k]=maxLen[j-1][k-1]+1;
else
maxLen[j][k]=max(maxLen[j-1][k],maxLen[j][k-1]);
}
}
if(maxLen[length2][length3]==length2)
printf("Data set %d: yes\n",w);
else
printf("Data set %d: no\n",w); }
else
printf("Data set %d: no\n",w);
} return 0;
}

Zipper(动态规划)的更多相关文章

  1. HDU 1501 Zipper 动态规划经典

    Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. 转载:hdu 动态规划题集

    1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955     背包;第一次做的时候把概率当做背包(放大100000倍化为整数): ...

  3. poj动态规划列表

    [1]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 13 ...

  4. POJ 动态规划题目列表

    ]POJ 动态规划题目列表 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322 ...

  5. hdu 动态规划(46道题目)倾情奉献~ 【只提供思路与状态转移方程】(转)

    HDU 动态规划(46道题目)倾情奉献~ [只提供思路与状态转移方程] Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包 ...

  6. soj1010. Zipper

    1010. Zipper Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Given three strings, yo ...

  7. 【转载】 HDU 动态规划46题【只提供思路与状态转移方程】

    1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955      背包;第一次做的时候把概率当做背包(放大100000倍化为整数) ...

  8. HDOJ 1501 Zipper 【简单DP】

    HDOJ 1501 Zipper [简单DP] Problem Description Given three strings, you are to determine whether the th ...

  9. 增强学习(三)----- MDP的动态规划解法

    上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...

随机推荐

  1. 史上最全的Maven Pom文件标签详解

    <span style="padding:0px; margin:0px"><project xmlns="http://maven.apache.or ...

  2. x64位windows 2003 server中“Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败”问题

    给朋友看一个老asp网站图片不能上传问题,试过网上各种办法都提示: Server 对象 错误 'ASP 0177 : 800700c1' Server.CreateObject 失败 最终问题出在x6 ...

  3. Mybatis多表查询(一对一、一对多、多对多)

    Mybatis的多表级联查询 . 一对一可以通过<association>实现,一对多和多对多通过<collection>实现. <discriminator> 元 ...

  4. ssh 连接很慢的解决办法

    http://blog.csdn.net/ablo_zhou/article/details/5074887 ============= 现象: 在局域网内,能ping通目标机器,并且时延是微秒级. ...

  5. DataTable记录

    DataTable dt2 = dt.Copy();//复制结构和数据 //复制结构,不要数据 DataTable dt2 = new DataTable(); for (int i = 0; i & ...

  6. gen_empty_obj算子的作用

    gen_empty_obj 算子解释: Create an empty object tuple. 其算子签名为: gen_empty_obj( : EmptyObject : : ) 那么有人要问: ...

  7. JavaScript stringObject.replace() 方法

    定义和用法: replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法: stringObject.replace(RegExp/substr,reol ...

  8. 添加普通用户为sudo用户

    https://www.linuxidc.com/Linux/2017-01/139361.htm 1.打开sudoers文件 切换到root用户下,cd root,运行visudo命令,visudo ...

  9. HDU 1569 方格取数(2) (最小割)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  10. 深入浅出python系列(一)包与模块

    一.包 包是由一系列模块组成的,模块简单就说是一个.py文件.比如说,现在有一个数学功能组,可以计算加.减.乘.除.幂运算等等,假定把这几个功能分成几个模块,一个模块就是一个.py文件.由这些不同的模 ...