HDU 5707 Combine String(动态规划)
题目链接: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(动态规划)的更多相关文章
- HDU 5707 Combine String (DP,LCS变形)
题意:给定三个字符串,问你第三个是不是由第一个和第二个组成的. 析:当时比赛是没有做出来啊...一直WA,就是没有判断长度,第一个和第二个和是不是和第三个一样,这个忘记... 我们用d[i][j]表示 ...
- Combine String HDU - 5707 dp or 广搜
Combine String HDU - 5707 题目大意:给你三个串a,b,c,问a和b是不是恰好能组成c,也就是a,b是不是c的两个互补的子序列. 根据题意就可以知道对于c的第一个就应该是a第一 ...
- 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] + ...
- 使用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)函数进行路径生成 明明是 ...
- HDU 2059 龟兔赛跑(动态规划)
龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 3008:Warcraft(动态规划 背包)
Warcraft Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu FatMouse's Speed 动态规划DP
动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3§ionid ...
- LeetCode 笔记系列 20 Interleaving String [动态规划的抽象]
题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example,Given: ...
- hdu 2084 数塔(动态规划)
本题是一个经典的动态规划题. 直接利用记忆化搜索:见图解 Ac code : #include<stdio.h> #include<string.h> #define max( ...
随机推荐
- /etc/rc.d/里文件的作用
rc.sysinit指的是系统启动不管进哪个运行级别必须做的初始化工作, rcn.d目录指的是系统进对应n的运行级别时候系统必须做的工作,目录下S打头的服务指进此运行级别时候启动的服务,而K打头的指离 ...
- JS事件大全及兼容
一般事件 事件 浏览器支持 描述 onClick IE3|N2|O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDblClick IE4|N4|O 鼠标双击事件 onMouseDown ...
- 【BZOJ】2154: Crash的数字表格 莫比乌斯反演
[题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...
- flex图片布局
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>f ...
- 关于linux的一些基础知识
一.基础 1.linux所有内容以文件形式保存,包括硬件. 2.linux 不区分扩展名,靠权限区分. #但是,约定 .sh脚本文件 .conf配置文件. 3.-rw-r--r-- ...
- 一款已上市MMO手游地图同步方案总结
1. 客户端地图格子的相关知识 在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都 ...
- ueditor和thinkphp框架整合修改版
基于tp官网上的一篇文章修改的 因为tp中所有目录其实都是性对于入口文件的 在原来的基础上略做修改后 已经做到 无论项目放在www下的任何位置 图片在编辑器中回填后都能正常显示! http://fi ...
- 2018 黑盾杯部分writeup
这次比赛拿了三十多名.呵呵.或许这就是菜吧. 比赛经验教训: 1.赛前一定要调整好情绪. 2.比赛尽量不要紧张,每一题都认认真真的看过去! 3.站在出题者的角度去思考问题 4.刷题 5.还是情绪吧.其 ...
- i春秋第二届春秋欢乐赛RSA256writeup
i春秋第二届春秋欢乐赛writeup 下载之后进行解压 发现四个文件 0x01看到题目是RSA的 又看到public.key 所以直接用kali linux的openssl 0x02可以看到e就是E ...
- Ubuntu 17.10 用 apt 搭建 lamp 环境、安装 phpmyadmin、redis 服务+扩展、mysql 扩展、开启错误提示、配置虚拟主机
2018-02-24 13:50:30 更新: 个人喜欢相对原生又不太麻烦,所以用 apt 构建环境.不过,最近使用到现在记得出现过了 3 次 apache 或 mysql 服务器无法启动或无法连接的 ...