poj 2192 Zipper

原创 2015年07月09日 22:46:48

1.确定每个字符串与合并之后的字符串在字符串的顺序不变的情况下,各个字符串与合并之后的字符串的正确字符的个数
2.在1的前提下,遍历求出当前元素之前,该字符串与合并之后的字符串相同元素的最大数

#include<iostream>
#include<string.h>
#include<math.h>
#include<fstream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector> 
#define MAXSIZE 100
using namespace std;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b)) 
int n = 0;
char s1[210], s2[210], s3[420];
int dp[210][210]; 
int main()
{
    //freopen("data_2192.txt","r",stdin);
    scanf("%d", &n);
    for (int k = 1; k <= n; k++)
    {
        memset(dp, 0, sizeof(dp));
        scanf("%s%s%s", s1, s2, s3);
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        for (int i = 1; i <= len1; i++)
        {
            if (s1[i - 1] == s3[i - 1])
            {
                dp[i][0] = max (dp[i][0], dp[i - 1][0] + 1);
            }else
            {
                dp[i][0] = dp[i - 1][0];
            }
        }
        for (int i = 1; i <= len2; i++)
        {
            if (s2[i - 1] == s3[i - 1])
            {
                dp[0][i] = max (dp[0][i], dp[0][i - 1] + 1);
            }else
            {
                dp[0][i] = dp[0][i - 1];
            }
        }
        for (int i = 1; i <= len1; i++)
        {
            for (int j = 1; j <= len2; j++)
            {
                 dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]);
                 if (s1[i - 1] == s3[i + j - 1])
                 {
                    dp[i][j] = max (dp[i][j], dp[i - 1][j] + 1);
                 }
                 if (s2[j - 1] == s3[i + j - 1])
                 {
                    dp[i][j] = max (dp[i][j], dp[i][j - 1] + 1);
                 }
            }
        }
        if (dp[len1][len2] == len1 + len2)
        {
            printf("Data set %d: yes\n", k);
        }else
        {
            printf("Data set %d: no\n", k);
        }
    }

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj2192(Zipper)

题目链接:http://poj.org/problem?id=2192          题意:给你三个字符串,问第三个字符串能否由前两个字符串按顺序组成(第三字符串的长度等于前两个字符串长度之和)...

POJ2192 Zipper(DP||DFS)

题意: 输入三个字符串,看前两个字符串能否组成第三个字符串,要求前两个字符串各自的字母顺序在第三个字符串中保持不变 要点: 可以用dp或dfs做,下面是dp的思路: 首先用定义一个数组dp[i][j]...

POJ---2192-Zipper

A - Zipper Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

POJ2192(Zipper)

DescriptionGiven three strings, you are to determine whether the third string can be formed by combi...

HDU-1501 (POJ-2192) Zipper (DFS||DP)

要不是放在dp专题里面,我还一直以为只能dfs做 看到一个dp的解法,才明白如何进行状态转移 设dp[i][j]表示串a的前i个字符与串b的前j个字符是否能形成串c的前i+j个字符, 若dp[i-1...

poj2192 Zipper(dp)

Zipper Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 17961 Accepte...

POJ-2192-Zipper

这个题要求求出C字符串能否由A字符串和B字符串组成 类似LCS,将字符串进行分别进行状态转移即可         dp[i][j]=max(dp[i-1][j],dp[i][j-1]);  ...

【算法刷题】poj 2192 Zipper

http://poj.org/problem?id=2192  两种 深搜剪枝or动规 回来补代码!

POJ 2192 Zipper

Problem Description Given three strings, you are to determine whether the third string can be forme...

POJ 2192 Zipper [dfs+剪枝 || dp]

题意: 给定三个字符串,如果前两个可以拼装成第三个,则输出yes,否则输出no。 思路: 1: DFS: 最直观的思路是可以用dfs去搜,从第三个字符串为目标串去dfs(0,0,0)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)