题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5707

题意:

给你三个字符串 S1, S2, S3, 让你判断 S3 是否恰好由字符串 S1 和 S2组成, S1 为 S3 的子串, S2 也为 S3 的子串, 可以不连续.

思路:

设 dp[i][j] 表示字符串 S3 的前 i + j 位是否可以由字符串 S1 的前 i 位以及字符串 S2 的前 j 位组成. dp[i][j] = 1 表示可以, dp[i][j] = 0 则表示不可以.

  则 dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - 1] 转移过来.如果 dp[i][j] 由 dp[i - 1][j] 转移而来,那么应该满足:

    dp[i - 1][j] 是合法状态( 即 dp[i - 1][j] = 1 ) 且 S1的第 i 个字符必须等于 S3 的第 i + j 个字符.

  如果 dp[i][j] 由 dp[i][j - 1] 转移而来, 那么应该满足:

    dp[i][j - 1] 是合法状态( 即 dp[i][j - 1] = 1 ) 且 S2 的第 j 个字符必须等于 S3 的第 i + j 个字符.

综上就可以得到状态转移方程:

    i == 0 && j == 0 : dp[i][j] = 1;                   //显然空串可以由两个空串组成,是合法状态. 除此之外其他状态的初始化应该为 0

    i != 0  && j == 0 : dp[i][j] = dp[i - 1][j] && S1[i - 1] == S3[i + j - 1]     //字符串下标从零开始

    i == 0 && j != 0  : dp[i][j] = dp[i][j - 1] && S2[j - 1] == S3[i + j - 1]

    i != 0  && j != 0  : dp[i][j] = ( dp[i - 1][j] && S1[i - 1] == S3[i + j - 1] )  ||  ( dp[i][j] = dp[i][j - 1] && S2[j - 1] == S3[i + j - 1] ) //两者满足其一即可

除此之外, 题目中还要求 S3 必须恰好由 S1 和 S2 组成, 则除满足 dp[ len(S1) ][ len(S2) ] == 1 之外, len(S1) + len(S2) == len(S3) 也应必须成立.

代码:

 #include <iostream>
#include <cstring> using namespace std;
typedef long long LL;
const int MAXN = ;
int dp[MAXN + ][MAXN + ]; int main() {
ios_base::sync_with_stdio(); cin.tie();
string s1, s2, s3;
while(cin >> s1 >> s2 >> s3) {
dp[][] = ; //dp[0][0] 为合法状态
unsigned int i, j;
for(i = ; i <= s1.length(); i++) {
for(j = ; j <= s2.length(); j++) {
if(i && j) dp[i][j] = ; //除 dp[0][0] 之外 其他状态的初始化
if(i) dp[i][j] = dp[i - ][j] & (s1[i - ] == s3[i + j - ]); //由于非0即1,所以可以按位与
if(j) dp[i][j] |=dp[i][j - ] & (s2[j - ] == s3[i + j - ]); // “ |= ” 是因为 俩个转移状态满足其一就可
}
}
cout << ( (dp[i - ][j - ] && i + j - == s3.length() ) ? "Yes":"No") << endl;
}
return ;
}

HDU 5707 Combine String(动态规划)的更多相关文章

  1. HDU 5707 Combine String (DP,LCS变形)

    题意:给定三个字符串,问你第三个是不是由第一个和第二个组成的. 析:当时比赛是没有做出来啊...一直WA,就是没有判断长度,第一个和第二个和是不是和第三个一样,这个忘记... 我们用d[i][j]表示 ...

  2. Combine String HDU - 5707 dp or 广搜

    Combine String HDU - 5707 题目大意:给你三个串a,b,c,问a和b是不是恰好能组成c,也就是a,b是不是c的两个互补的子序列. 根据题意就可以知道对于c的第一个就应该是a第一 ...

  3. HDU 4054 Number String

    HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...

  4. 使用System.IO.Combine(string path1, string path2, string path3)四个参数的重载函数提示`System.IO.Path.Combine(string, string, string, string)' is inaccessible due to its protection level

    今天用Unity5.5.1开发提取Assets目录的模块,使用时采用System.IO.Path.Combine(string, string, string, string)函数进行路径生成 明明是 ...

  5. HDU 2059 龟兔赛跑(动态规划)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. hdu 3008:Warcraft(动态规划 背包)

    Warcraft Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. hdu FatMouse's Speed 动态规划DP

    动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid ...

  8. LeetCode 笔记系列 20 Interleaving String [动态规划的抽象]

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given: ...

  9. hdu 2084 数塔(动态规划)

    本题是一个经典的动态规划题. 直接利用记忆化搜索:见图解 Ac code : #include<stdio.h> #include<string.h> #define max( ...

随机推荐

  1. --BEA官方网站(http: //www.bea.com)甲骨文已完成对该公司的收购BEA Weblogic Server 7.0x应用服务器简明安 装、配置手册 1

    ====================简 介: BEA公司是业内著名的中间件产商,以Tuxedo及Weblogic闻名于世,而其基础件平台(infrastructure)Weblogic platf ...

  2. java请求url返回json

    package cn.it.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ...

  3. Python学习笔记(四十)— 内置模块(9)HTMLParser

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432002312 ...

  4. JavaScript使用数组

    for循环遍历 //js的数组里可以存各种类型 var arr =[1,5,true,false,'小明']; //遍历 for(var i=0;i<arr.length;i++){ alert ...

  5. 关于angularJS的一些用法

    AngularJS 事件指令: ng-click/dblclick ng-mousedown/up ng-mouseenter/leave ng-mousemove/over/out ng-keydo ...

  6. WordPress手机端插件——WPtouch

    戒微博之后,把更多的精力开始转投回网站上来:今天用nexus7访问@Bee君 的博客时,发现博客的界面与电脑上访问的界面不相同,顺藤摸瓜之后发现原来bee君使用的是WPtouch-pro插件来实现移动 ...

  7. python OS 模块 文件目录操作

    Python OS 模块 文件目录操作 os模块中包含了一系列文件操作的函数,这里介绍的是一些在Linux平台上应用的文件操作函数.由于Linux是C写的,低层的libc库和系统调用的接口都是C AP ...

  8. 64_p10

    python3-matplotlib-qt4-2.0.0-2.fc26.2.x86_64.rpm 05-Apr-2017 09:54 29438 python3-matplotlib-qt5-2.0. ...

  9. 安装完ODTwithODAC112012,出现ORA-12560:TNS:协议适配器错误

    参考:http://blog.csdn.net/tan_yixiu/article/details/6762357 操作系统:windows2008 Enterprise 64位 开发工具:VS201 ...

  10. 【UOJ#38】【清华集训2014】奇数国

    考虑欧拉函数的性质,60很小,压位存下线段树每个节点出现质数. #include<bits/stdc++.h> ; ; typedef long long ll; using namesp ...