HDU 6170 递推 DP,思考状态的递进
来源:互联网 发布:dota2比赛数据直播 编辑:程序博客网 时间:2024/06/03 20:15
递推 DP,思考状态的递进
题意:
给出一个原串和一个需要匹配的串,当然匹配串有两种操作。
- ‘.’ 可以变成任何字母
∗ 可以使得前一个字母变成任何长度>= 0,例如:a∗,可以变成“aa”,“aaa”甚至把a消失“”
问是否能从匹配串变成原串。
题意:
当前串能不能匹配需要知道之前一个串状态,很明显的dp问题,为什么我当时没有想出来?为什么我要用复杂的dfs去不断超时。
因为匹配串可以增长或者剪短,所以首先需要思考枚举匹配串,然后再思考状态
定义:
假设s1为原串,s2为匹配串。
- 当
s1[j]==s2[i]||s2[i]==′.′ 的时候只能看前一个状态是否可以匹配dp[i−1][j−1] - 当
s2[i]==′∗′ ,思考∗ 的 功能:当可以删除i-1这个字母的时候:dp[i−2][j]=true ,当不增也不减的时候 :dp[i−1][j]==true ,当需要增加的时候:(dp[i−1][j−1]==true或者dp[i][j−1])并且s1[j]==s1[j−1]
然后两重循环可以解决。需要一个特判:当
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 2505;char s1[maxn],s2[maxn];int dp[maxn][maxn];int main(){ //freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%s%s",s1+1,s2+1); int len1 = strlen(s1+1); int len2 = strlen(s2+1); dp[0][0] = 1; for(int i = 1;i <= len2; i++) { if(i == 2 && s2[i] == '*') dp[i][0] = true; for(int j = 1;j <= len1; j++) { if(s2[i] == s1[j] || s2[i] == '.') dp[i][j] = dp[i-1][j-1]; if(s2[i] == '*') { if( (dp[i-1][j-1] || dp[i][j-1]) && s1[j] == s1[j-1]) { dp[i][j] = true; } else if(dp[i-1][j] || dp[i-2][j]) { dp[i][j] = true; } } } } if(dp[len2][len1]) printf("yes\n"); else printf("no\n"); } return 0;}
阅读全文
0 0
- HDU 6170 递推 DP,思考状态的递进
- hdu 1267 下沙的沙子有几粒?(递推&DP)
- HDU 2067 小兔的棋盘 递推/dp
- HDU 2018 母牛的故事(DP递推)
- HDU2084 DP + 水 /入门+ 递推 + 从后往前思考问题的方式
- hdu 4472 Count DP 递推
- hdu 一卡通大冒险 递推 或是 dp
- 【递推】【DP】-HDU-1207-汉诺塔②
- 【递推】【DP】-HDU-1995-汉诺塔⑤
- 【递推】【DP】-HDU-1996-汉诺塔⑥
- 【递推】【DP】-HDU-2064-汉诺塔③
- 【递推】【DP】-HDU-2175-汉诺塔⑨
- HDU 3831 DICS 递推dp
- HDU 5375 Gray code //递推dp
- HDU 2709 Sumsets(DP递推)
- HDU 2709 总结 DP/递推
- hdu 5719 Arrange (dp 递推 排列组合)
- HDU 4489 (DP递推计数)
- 关于gitlab 9.1.2 (最新版)的安装、卸载及配置
- 获取ng-click 的 element
- 文章标题
- 从零开始搭建你的Web服务器
- 导入的项目有红色叹号
- HDU 6170 递推 DP,思考状态的递进
- myeclipse 2014打开jsp页面卡死问题
- hdu 6153 (扩展kmp)
- Android官方DataBinding(八):Lambda长表达式事件处理
- 今天开始用Atom
- 【bzoj2002】[Hnoi2010]Bounce 弹飞绵羊
- 批删tp
- 2482-二叉排序树
- 在js中改变单选框选中状态