暴力dp+状态设计思维——cf1303E

感觉这一题的状态设计很有讲究

一开始的思路是枚举s的前半部分,去贪心的匹配t串,然后再看剩余部分是否可以匹配t的后半部分

但这种思路显然是错的(样例都过不了),原因是可能t后半部分的某个特征串只在s中(对应的一个特征序列)出现了一次,

但是这个s中的特征序列由于被t前半部分贪心的匹配,被打破了,所以不能成功匹配后半部分

后来想到枚举t的前半部分和后半部分,然后用一个二维dp[i][j]去枚举匹配即可

/*
枚举pos:1->T,表示t被分成t[1..pos]和t[pos+1..T]两个串
dp[i][j]表示 t1匹配到i位,t2匹配到j位的最短的s前缀
*/
#include<bits/stdc++.h>
using namespace std;
#define N 405

char s[N],t[N];
int S,T,dp[N][N],nxt[N][26],pos[26];

void init(){
    for(int i=0;i<26;i++)pos[i]=S+1;
    for(int i=S;i>=0;i--){
        for(int j=0;j<26;j++)
            nxt[i][j]=pos[j];
        if(i)pos[s[i]-‘a‘]=i;
    }
}

char t1[N],t2[N];
int len1,len2;
int solve(int pos){
    for(int i=0;i<=T;i++)
        for(int j=0;j<=T;j++)
            dp[i][j]=0x3f3f3f3f;
    len1=pos,len2=T-pos;
    for(int i=1;i<=len1;i++)t1[i]=t[i];
    for(int i=1;i<=len2;i++)t2[i]=t[i+pos];

    dp[0][0]=0;
    for(int i=0;i<=len1;i++)
        for(int j=0;j<=len2;j++){
            if(i==0 && j==0)continue;
            if(i){
                int last=dp[i-1][j];
                if(last<=S)
                    dp[i][j]=min(dp[i][j],nxt[last][t1[i]-‘a‘]);
            }
            if(j){
                int last=dp[i][j-1];
                if(last<=S)
                    dp[i][j]=min(dp[i][j],nxt[last][t2[j]-‘a‘]);
            }
        }
    if(dp[len1][len2]<=S)return 1;
    return 0;
}

int main(){
    int tt;cin>>tt;
    while(tt--){
        scanf("%s%s",s+1,t+1);
        S=strlen(s+1);
        T=strlen(t+1);
        init();

        int flag=0;
        for(int i=1;i<=T;i++)
            if(solve(i))flag=1;
        if(flag)puts("YES");
        else puts("NO");
    }
} 

原文地址:https://www.cnblogs.com/zsben991126/p/12311230.html

时间: 2024-07-30 05:51:24

暴力dp+状态设计思维——cf1303E的相关文章

教主泡嫦娥[有趣的dp状态设计]

P1342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方舟上.但也有很多百姓平民想搭乘方舟,毕竟他们不想就这么离开世界,所以他们决定要么登上方舟,要么毁掉方舟. LHX教主听说了这件事之后,果断扔掉了手中的船票.在地球即将毁灭的那一霎那,教主自制了一个小型火箭,奔向了月球…… 教主登上月球之后才发现,他的女朋友忘记带到月球了,为此他哭了一个月.但细心

Dp状态设计与方程总结

1.不完全状态记录<1>青蛙过河问题<2>利用区间dp 2.背包类问题<1> 0-1背包,经典问题<2>无限背包,经典问题<3>判定性背包问题<4>带附属关系的背包问题<5> + -1背包问题<6>双背包求最优值<7>构造三角形问题<8>带上下界限制的背包问题(012背包) 3.线性的动态规划问题<1>积木游戏问题<2>决斗(判定性问题)<3>圆的最大

dp状态压缩

dp状态压缩 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的就是那种状态很多,不容易用一般的方法表示的动态规划问题,这个就更加的难于把握了.难点在于以下几个方面:状态怎么压缩?压缩后怎么表示?怎么转移?是否具有最优子结构?是否满足后效性?涉及到一些位运算的操作,虽然比较抽象,但本质还是动态规划.找准动态规划几个方面的问题,深刻理解动态规划的原理,开动脑筋思考问题.这才是掌握动态规划的关键. 动态规划最关键的要处理的问题就是位运算的操作,容易出错,状态的设计也直

HDU 5346 MZL&#39;s game (状态设计各种强)

真是太奇妙了,感觉这是这个暑假写的最厉害的DP了(说的好像写过几道DP一样),设计的状态精妙. 因为题解不知道在说个毛线,而且貌似写错了,请问i-1的时候有j-1的活人为什么多攻击一次人会复活?反正我没看懂..而且下面还有情况接下来说. 把它翻译成人话.. 由于每个人等概率出于任意一个位置.不妨视为有序,即从1-n一个一个选中人.该人死亡则跳过.最后统计出所有位置的情况即为一个人的存活率(这个题解说的好像比我容易懂= =) 设计的状态是 dp[i][j]表示,选中第i个人时,第i-n(即没有攻击

(hiho1048)POJ2411Mondriaan&#39;s Dream(DP+状态压缩 or 轮廓DP)

问题: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and rectangle

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然

API不是从业务抽象出来的(1):设计思维

[back]  微课名称:     API不是从业务抽象出来的(1):设计思维 微课目标: 本微课举例说明这项初学者常常误解的软件编程思维许多人相信API是从业务需求所抽象出来的,真的吗? 本课程就来探讨这个议题.此议题是另一个是频课程(名称:"父类不是抽象出来的!")的姊妹作品. 微课介绍: 其实,API是分解出来的,是将<买主知识>分离开来而得的.本课程详细讲解业务领域知识(Domain Knowledge)与买主知识的切分方法与原则.让您轻易学会App框架的开发,及其

暴力/DP Codeforces Beta Round #22 (Div. 2 Only) B. Bargaining Table

题目传送门 1 /* 2 题意:求最大矩形(全0)的面积 3 暴力/dp:每对一个0查看它左下的最大矩形面积,更新ans 4 注意:是字符串,没用空格,好事多磨,WA了多少次才发现:( 5 详细解释:http://www.cnblogs.com/cszlg/p/3217478.html 6 */ 7 #include <cstdio> 8 #include <algorithm> 9 #include <cstring> 10 #include <cmath>

重构改善既有代码的设计思维导图

最近闲来无事就把之前看的书,做了一张张的思维导图,来分享给大家 重构改善既有代码的设计思维导图: --------------- 不知道是博客园的问题,还是我的浏览器的问题,图片没法上传,如有人想要想看 可以给我发邮件: [email protected]  只为共同学习.也可以留言!!!