题目链接:http://poj.org/problem?id=2192

思路分析:该问题可以看做dp问题,同时也可以使用dfs搜索求解,这里使用dp解法;

设字符串StrA[0, 1, …, n]和StrB[0,1, .., m]构成字符串Str[0, 1, … , m + n + 1];

1)状态定义:dp[i, j]表示字符串StrA[0, 1, …, i-1]和字符串StrB[0, 1, .., j-1]构成字符串Str[0, 1, …, i+j-1];

2)状态转移:如果dp[i-1][j]==1 && StrA[i-1] == Str[i+j-1]或者dp[i][j-1] == 1 && StrB[j-1] == Str[i+j-1],则dp[i][j]==1;

3)最优子结构:该问题中子结构有解才有可能使原问题有解,另外可以从该问题中看出dp与搜索的关系;

代码如下:

#include <cstring>
#include <iostream>
using namespace std; const int MAX_N = + ;
char str_a[MAX_N], str_b[MAX_N], str[ * MAX_N];
int dp[MAX_N][MAX_N]; int main()
{
int test_case, case_count = ;
int len_str_a, len_str_b; scanf("%d", &test_case);
while (test_case--)
{
scanf("%s %s %s", str_a, str_b, str); len_str_a = strlen(str_a);
len_str_b = strlen(str_b);
memset(dp, , sizeof(dp));
for (int i = ; i <= len_str_a; ++ i)
{
for (int j = ; j <= len_str_b; ++ j)
{
if (i == && j == )
dp[i][j] = ;
else
{
if (i >= && dp[i - ][j] == && str[i + j - ] == str_a[i-])
dp[i][j] = ;
if (j >= && dp[i][j - ] == && str[i + j - ] == str_b[j-])
dp[i][j] = ;
}
}
}
printf("Data set %d: ", ++case_count);
if (dp[len_str_a][len_str_b] == )
printf("yes\n");
else
printf("no\n");
}
return ;
}

poj 2192 Zipper(区间dp)的更多相关文章

  1. POJ 2995 Brackets 区间DP

    POJ 2995 Brackets 区间DP 题意 大意:给你一个字符串,询问这个字符串满足要求的有多少,()和[]都是一个匹配.需要注意的是这里的匹配规则. 解题思路 区间DP,开始自己没想到是区间 ...

  2. POJ 1179 - Polygon - [区间DP]

    题目链接:http://poj.org/problem?id=1179 Time Limit: 1000MS Memory Limit: 10000K Description Polygon is a ...

  3. POJ 1160 经典区间dp/四边形优化

    链接http://poj.org/problem?id=1160 很好的一个题,涉及到了以前老师说过的一个题目,可惜没往那上面想. 题意,给出N个城镇的地址,他们在一条直线上,现在要选择P个城镇建立邮 ...

  4. POJ 1390 Blocks(区间DP)

    Blocks [题目链接]Blocks [题目类型]区间DP &题意: 给定n个不同颜色的盒子,连续的相同颜色的k个盒子可以拿走,权值为k*k,求把所有盒子拿完的最大权值 &题解: 这 ...

  5. poj 2955"Brackets"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给你一个只由 '(' , ')' , '[' , ']' 组成的字符串s[ ], ...

  6. POJ 1159 Palindrome(区间DP/最长公共子序列+滚动数组)

    Palindrome Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 56150   Accepted: 19398 Desc ...

  7. HOJ 1936&POJ 2955 Brackets(区间DP)

    Brackets My Tags (Edit) Source : Stanford ACM Programming Contest 2004 Time limit : 1 sec Memory lim ...

  8. IOI 98 (POJ 1179)Polygon(区间DP)

    很容易想到枚举第一步切掉的边,然后再计算能够产生的最大值. 联想到区间DP,令dp[i][l][r]为第一步切掉第i条边后从第i个顶点起区间[l,r]能够生成的最大值是多少. 但是状态不好转移,因为操 ...

  9. POJ 1390 Blocks (区间DP) 题解

    题意 t组数据,每组数据有n个方块,给出它们的颜色,每次消去的得分为相同颜色块个数的平方(要求连续),求最大得分. 首先看到这题我们发现我们要把大块尽可能放在一起才会有最大收益,我们要将相同颜色块合在 ...

  10. poj 2955 Brackets (区间dp基础题)

    We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a ...

随机推荐

  1. hive 学习笔记精简

    创建表: drop table t create table if not exists t (t string) partitioned by (log_date string) row forma ...

  2. PL/SQL编程要点和注意点

    http://www.itpub.net/thread-1560427-3-1.html 1. 非关键字小写,关键字大写,用下划线分隔,用前缀区分变量与表列名.不强求变量初始值.2. 永远只捕获可预测 ...

  3. leetcode Longest Palindromic Substring python

    class Solution(object): def longestPalindrome(self, s): """ :type s: str :rtype: str ...

  4. UVALive 6709 - Mosaic 二维线段树

    题目链接 给一个n*n的方格, 每个方格有值. 每次询问, 给出三个数x, y, l, 求出以x, y为中心的边长为l的正方形内的最大值与最小值, 输出(maxx+minn)/2, 并将x, y这个格 ...

  5. 一道Python练习题

    有关字符串与编码的,转自廖雪峰Python教程. 小明的成绩从去年的72分提升到了今年的85分,请计算小明成绩提升的百分点,并用字符串格式化显示出'xx.x%',只保留小数点后1位: # -*- co ...

  6. [转贴]JavaScript中Array(数组)的属性和方法

    数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8); var c = new Array("first", &qu ...

  7. nat123外网SSH访问内网LINUX的N种方法

    一,动态公网IP环境 1,环境描述: 路由器分配的是动态公网IP,且有路由管理权限,LINUX主机部署在路由内网.如何实现外网SSH访问内网LINUX主机? 2,解决方案: 使用nat123动态域名解 ...

  8. HTML5 RPG游戏示例

    演示地址 点击打开链接

  9. JavaScript 实现Map

    var map=new Map(); map.put("a","A");map.put("b","B");map.put ...

  10. 最近用的到的一些js的常用方法(简单的)

    由于新的项目开始了,是使用MVC 5.0 开发的,前端使用了两个主流的框架 UIKIT,Ignite UI(收费) 因为是mvc主要用json来交互,不能避免要对前端脚本进行操作,所以就将能用到的方法 ...