题目链接: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. vue 一开始

    项目安装 vue init webpack bibivue-router Y npm run dev

  2. [DeeplearningAI笔记]卷积神经网络1.9-1.11池化层/卷积神经网络示例/优点

    4.1卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9池化层 优点 池化层可以缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性. 池化层操作 池化操作与卷积操作类似 ...

  3. Tensorflow模型变量保存

    Tensorflow:模型变量保存 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献Tensorflow实战Google深度学习框架 实验平台: Tensorflow1.4.0 pyt ...

  4. 01 DIV+CSS 固定页面布局

    本文讲解使用DIV+CSS布局最基本的内容,读完本文你讲会使用DIV+CSS进行简单的页面布局. DIV+CSS布局中主要CSS属性介绍: Float: Float属性是DIV+CSS布局中最基本也是 ...

  5. 【BZOJ】1706: [usaco2007 Nov]relays 奶牛接力跑

    [题意]给定m条边的无向图,起点s,终点t,要求找出s到t恰好经过n条边的最短路径.n<=10^6,m<=100. [算法]floyd+矩阵快速幂 [题解] 先对点离散化,得到点数N. 对 ...

  6. 在Windows下安装MongoDB

    概述 读者可以通过本文来学习在Windows操作系统上安装MongoDB. 从2.2版本开始,Mongo DB不在支持Windows XP.请使用最近的windows来安装最近发布的MongoDB.本 ...

  7. 2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)

    题目链接 Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,0) , ...

  8. linux 在命令行中通过conda使用anaconda

    在 ~/.bash_profile中添加 export PATH="/home/taoke/anaconda/bin:$PATH"

  9. linux配置samba服务【原创】

    转载请注明出处http://www.cnblogs.com/paul8339/p/7509981.html 需求,windows服务器访问linux的共享文件,需要linux服务器安装并配置samba ...

  10. Deep Learning基础--理解LSTM/RNN中的Attention机制

    导读 目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门,是因为它在许多领域较其他的传统模型方法都取得了更好的结果.这种结构的模型通常将输入序列编码成一个固定长度的向量表示,对 ...