hdu 5707 Combine String dphen dp

来源:互联网 发布:手机淘宝链接怎么弄 编辑:程序博客网 时间:2024/06/01 23:06

Combine String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 2210    Accepted Submission(s): 624


Problem Description
Given three strings ab and c, your mission is to check whether c is the combine string of a and b.
A string c is said to be the combine string of a and b if and only if c can be broken into two subsequences, when you read them as a string, one equals to a, and the other equals to b.
For example, ``adebcf'' is a combine string of ``abc'' and ``def''.
 

Input
Input file contains several test cases (no more than 20). Process to the end of file.
Each test case contains three strings ab and c (the length of each string is between 1 and 2000).
 

Output
For each test case, print ``Yes'', if c is a combine string of a and b, otherwise print ``No''.
 

Sample Input
abcdefadebcfabcdefabecdf
 

Sample Output
Yes

No

很屌丝的题。。

看到的第一眼暴力while走了一遍。。

贪心思想觉得没毛病啊///可是真的有毛病啊。。。

wa了4发。。

得到一组数据

ab

abc

aabcb

abc

ab

aabcb

两个都是Yes

贪心会有一个No

果断dp

dp【i】【j】

i是s1 的某个

j是s2

if(s1[i]==s[i+j])                    dp[i+1][j]|=dp[i][j];                if(s2[j]==s[i+j])                    dp[i][j+1]|=dp[i][j];


#include<stdio.h>#include<string.h>int dp[2003][2003];char s[2003];char s1[2003];char s2[2003];int main(){    while(~scanf("%s %s %s",s1,s2,s))    {        memset(dp,0,sizeof(dp));        int Flag=0;        int len1=strlen(s1);        int len2=strlen(s2);        int len=strlen(s);        dp[0][0]=1;        for(int i=0;i<=len1;i++)        {            for(int j=0;j<=len2;j++)            {                
if(s1[i]==s[i+j])                    dp[i+1][j]|=dp[i][j];                if(s2[j]==s[i+j])                    dp[i][j+1]|=dp[i][j];
} } if(dp[len1][len2]&&len==len1+len2) printf("Yes\n"); else printf("No\n"); }}



原创粉丝点击