POJ 2192 【DP】

题意:

给三个字符串,判断前两个在相对顺序不变的情况下是否可以组成第三个字符串。

思路:

先说屌丝:

dp[i][j]代表1串的前i个和2串的前j个字符在3串的前i+j个字符中最多能够组合出几个字符。

然后状态转移是:

如果stra[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i-1][j]+1)

同样的若strb[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i][j-1]+1)

最后判断dp[lena][lenb]是否等于lena+lenb

再说大神思路:

大神直接把dp定义成bool型,初始化dp[0][0]=1;

然后dp[i]][j]=dp[i-1][j]&&tmpa[i]==tmpc[i+j]||dp[i][j-1]&&tmpb[j]==tmpc[i+j]

屌丝代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[205][205];
int main()
{
    int t;
    scanf("%d",&t);
    char tmpa[205],tmpb[205],tmpc[505];
    for(int tt=1; tt<=t; tt++)
    {
        memset(dp,0,sizeof(dp));
        scanf("%s%s%s",tmpa+1,tmpb+1,tmpc+1);
        int lena=strlen(tmpa+1);
        int lenb=strlen(tmpb+1);
        int lenc=strlen(tmpc+1);
        if(lena+lenb!=lenc)
        {
            printf("Data set %d: no\n",tt);
        }
        else
        {
            for(int i=0; i<=lena; i++)
            {
                for(int j=0; j<=lenb; j++)
                {
                    if(i!=0)
                    {
                        if(tmpa[i]==tmpc[i+j])
                        {
                            dp[i][j]=dp[i-1][j]+1;
                        }
                        else
                        {
                            dp[i][j]=dp[i-1][j];
                        }
                    }
                    if(j!=0)
                    {
                        if(tmpb[j]==tmpc[i+j])
                        {
                            dp[i][j]=max(dp[i][j],dp[i][j-1]+1);
                        }
                        else
                        {
                            dp[i][j]=max(dp[i][j],dp[i][j-1]);
                        }
                    }
                }
            }
            /*for(int i=0;i<=lena;i++)
            {
                for(int j=0;j<=lenb;j++)
                {
                    printf("%d ",dp[i][j]);
                }
                puts("");
            }*/
            if(dp[lena][lenb]==lenc)
            {
                printf("Data set %d: yes\n",tt);
            }
            else
            {
                printf("Data set %d: no\n",tt);
            }
        }
    }
}
时间: 2024-12-28 13:05:24

POJ 2192 【DP】的相关文章

POJ 3230 【DP】

题意: 某货旅行,在n个城市呆m天. 给出从第i个城市到第j个城市的路费,或者留在某个城市的生活费. 给出在第i天在第j个城市的收益. 可以在城市之间任意穿梭逗留没有其他特殊要求. 求收益最大是多少. 思路: dp[i][j]代表这货在第i天在第j个城市的最大收益. 然后状态转移方程是dp[i][j]=max(dp[i-1][1..n]+枚举目标城市计算收益)[这里少写了目标城市的那层循环,一共三层循环] #include<stdio.h> #include<string.h> #

POJ 2346 【DP】

题意: 给一个正的不大于10的偶数n,求n个数字组成的数字串前n/2位和后n/2位的和相等的个数. 思路: dp[i][j]由i位数组成的和为j的数字串的个数. dp[i][j]+=dp[i-1][j-k]; 最后排列组合一下. #include<stdio.h> long long dp[6][50]; int main() { int n; scanf("%d",&n); for(int i=0;i<=9;i++) { dp[1][i]=1; } for(

poj 2411 Mondriaan&#39;s Dream 【dp】

题目:poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然后问你最多由多少种不同的方案. 分析:这是一个比较经典的题目,网上各种牛B写法一大堆.题解也是 我们可以定义状态:dp[i][st]:在第 i 行状态为 st 的时候的最大方案数. 然后转移方程:dp[i][st] = sum (dp[i-1][ss]) 即所有的当前行都是由上一行合法的状态转移而来. 而状态的合法性由两种铺法得到,第一种横放,注意要求前一行全满,然后竖放,上一行为空

POJ 2411【题解】Mondriaan&#39;s Dream 状压DP

题目链接:http://poj.org/problem?id=2411 把每一行当作一个二进制状态. 1表示是一个竖着的1*2的方格. 0表示其他状态. 那么显然当i-1的状态k能转移到i的j: 1.j 和 k 的按位与为0.(有1必须要0,0也可以有1) 2.j 和 k 按位或每一段0都有偶数个.(表示横着的长方形) 那么就可以预处理一下合格的点. 然后状压DP. 代码如下: #include<cstdio> using namespace std; int n,m; long long f

hdoj 2391 Filthy Rich 【DP】

题目大意:有个二维数组,你从(0,0)出发,最终到(n,m), 在这个二维数组中,每个位置dp[i][j]都有一定量的黄金,你可以拾取,问你最多能失去多少,并且,你的方向有下,右, 斜向下三个方向: 策略:就是每一个都加上它的上方向与左方向的最大值,这样到最后就是最大值.详情见代码 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2391 代码: #include<stdio.h> #include<string.h> int dp[1

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

nyoj 325 zb的生日 【DP】||【DFS】

两种方法: 第一种:将总数一半当做背包,用总数-2*最多能装的数目就是所求: 第二种:深搜: zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜.当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能

HDOJ4540 威威猫系列故事——打地鼠 【DP】

威威猫系列故事--打地鼠 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1445    Accepted Submission(s): 713 Problem Description 威威猫最近不务正业,每天沉迷于游戏"打地鼠". 每当朋友们劝他别太着迷游戏,应该好好工作的时候,他总是说,我是威威猫,猫打老鼠就是我的工作! 无话

NYOJ16 矩形嵌套 【DP】

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数, 每组