三个串必须要一起dp

之前刚学了dfs的记忆化搜索的dp方式 觉得很舒服 现学现卖然后两个小时都没有做出来

优化1:之前在dfs中 对每一个pos都会枚举所有可能的组合 结合当前状态来产生新的状态 来决定接下来是直接算还是继续dfs

枚举的结果 只与当前状态和for的区间有关 所以提前预处理出每种情况的结果

优化完跑了个长2W的全?序列 在跑到pos=1W3左右的时候崩溃 手动加栈依然在这里崩溃 猜想是栈崩了。。

优化2:进行完优化1后代码变得好看多了 发现在每一步的结果只与下一步有关 还很严格 于是可以搞一个dp[zt][pos]出来 根据上一个优化算的状态数组直接从pos+1推出来

感想:dfs写dp是挺舒服 但是得是特定的 像数位dp就会很舒服 普通dp就不一定 大概是我接受了for写dp的设定

   dfs写dp得注意深度。。之前写的dp才300层。。1e6的再敢写就剁手

   for循环计数有时候可以用很舒服的预处理给做了

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<string>
#include<iostream>
#include<algorithm>
#include<stack>
#include<set>
using namespace std;
#define L long long
#define pb push_back
#define lala printf("--------\n");
#define ph push
#define rep(i, a, b) for (L i=a;i<=b;++i)
#define dow(i, b, a) for (L i=b;i>=a;--i)
#define fmt(i,n) if(i==n)printf("\n");else printf(" ") ;
#define rnode(i,u) for(L i = head[u] ; i != -1 ; i = b[i].nex)
#define fi first
#define se second
template<class T> inline void flc(T &A, L x){memset(A, x, sizeof(A));}
L read(){L x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;}const L mod = 1e9+9 ;char a[1000050] ;
char b[1000050] ;
char c[1000050] ;
L la,lb,lc;
L dp[3][1000050] ;
L G[28][28][28][5][5] ;
void init() {flc(G,0) ;rep(aa,0,27) rep(bb,0,27) rep(cc,0,27) {L La=1,Ra=26;L Lb=1,Rb=26;L Lc=1,Rc=26;if(aa!=27)La=Ra=aa;if(bb!=27)Lb=Rb=bb;if(cc!=27)Lc=Rc=cc;L (&g)[5][5] = G[aa][bb][cc] ;rep(a,La,Ra)rep(b,Lb,Rb)rep(c,Lc,Rc){g[1][2] += a<b&&b<c ;g[1][1] += a==b&&b==c ;g[1][3] += a<b&&b==c ;g[1][4] += a==b&&b<c ;g[3][2] += b<c ;g[3][3] += b==c ;g[4][2] += a<b ;g[4][4] += a==b ;g[2][2] ++ ;}}
}
L jfhsb[1000050][5] ;
L zhrsb() {flc(jfhsb,0) ;dow(pos,la,1) {rep(zt,1,4){L aa,bb,cc;if(a[pos]=='?')aa=27;else aa=a[pos]-'a'+1;if(b[pos]=='?')bb=27;else bb=b[pos]-'a'+1;if(c[pos]=='?')cc=27;else cc=c[pos]-'a'+1;L ztt2 = (((((dp[0][pos] * dp[1][pos])) % mod ) * dp[2][pos])%mod) ;L ztt1 = jfhsb[pos+1][1]%mod ;L ztt3 = jfhsb[pos+1][3]%mod ;L ztt4 = jfhsb[pos+1][4]%mod ;L zt1 = (ztt1 * G[aa][bb][cc][zt][1])%mod ;L zt2 = (ztt2 * G[aa][bb][cc][zt][2])%mod ;L zt3 = (ztt3 * G[aa][bb][cc][zt][3])%mod ;L zt4 = (ztt4 * G[aa][bb][cc][zt][4])%mod ;jfhsb[pos][zt] = (((((zt1+zt2)%mod)+zt3)%mod)+zt4) % mod;}}return jfhsb[1][1] ;
}int main () {init() ;L t ;scanf("%lld" , &t) ;while(t--){flc(dp,0) ;scanf("%s",a+1);scanf("%s",b+1);scanf("%s",c+1);la = strlen(a+1) ; lb = strlen(b+1) ; lc = strlen(c+1) ;L maxx = max(la,max(lb,lc)) ;rep(i,la+1,maxx) a[i] = 'a' - 1 ;rep(i,lb+1,maxx) b[i] = 'a' - 1 ;rep(i,lc+1,maxx) c[i] = 'a' - 1 ;a[maxx+1] = '\0' ;b[maxx+1] = '\0' ;c[maxx+1] = '\0' ;la = lb = lc = maxx ;L wh = 1 ;for(L i=la;i>=1;i--){if(a[i]=='?'){wh %= mod ;dp[0][i] = wh ;wh *= 26 ;wh %= mod ;}else {dp[0][i] = wh ;}}wh = 1 ;for(L i=lb;i>=1;i--){if(b[i]=='?'){wh %= mod ;dp[1][i] = wh ;wh *= 26 ;wh %= mod ;}else {dp[1][i] = wh ;}}wh = 1 ;for(L i=lc;i>=1;i--){if(c[i]=='?'){wh %= mod ;dp[2][i] = wh ;wh *= 26 ;wh %= mod ;}else {dp[2][i] = wh ;}}L ans = zhrsb() ;printf("%lld\n" , ans) ;}
}

转载于:https://www.cnblogs.com/rayrayrainrain/p/7635471.html

uvalive 6932相关推荐

  1. DP UVALive 6506 Padovan Sequence

    题目传送门 /*题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + a[ ...

  2. The UVALIVE 7716 二维区间第k小

    The UVALIVE 7716 二维区间第k小 /** 题意:给一个n * n的矩阵,有q个查询每次查询r,c,s,k表示已(r,c)为右上角 大小为s的正方形中 第k小的元素n <= 250 ...

  3. UVALive 8513 lovers 2017 西安区域赛 B 贪心+multiset

    UVALive 8513 有2种人,每个人有自己的权值$A_i$ $B_i$ 当$A_i + B_i >=K$时 两个人可以配对 问最多多少人可以配对 解法 : 把$/{ A_i /}$ 排序 ...

  4. 训练指南 UVALive - 3713 (2-SAT)

    layout: post title: 训练指南 UVALive - 3713 (2-SAT) author: "luowentaoaa" catalog: true mathja ...

  5. 逆序数 UVALive 6508 Permutation Graphs

    题目传送门 1 /* 2 题意:给了两行的数字,相同的数字连线,问中间交点的个数 3 逆序数:第一行保存每个数字的位置,第二行保存该数字在第一行的位置,接下来就是对它求逆序数 4 用归并排序或线段树求 ...

  6. Infinite Fraction Path UVALive - 8207

    Infinite Fraction Path UVALive - 8207 题意: 给你n个数,每个数在0到9之间,每个数的下标一次是0~n-1,然后他所能走到的数为(i^2+1)%n,i为他本身的下 ...

  7. F - Heron and His Triangle UVALive - 8206

    F - Heron and His Triangle UVALive - 8206 题意: 给你应该n,然后求一个最小的t,问长度为t-1,t,t+1所组成的三角形的面积为整数,t>=n 题解: ...

  8. Tree UVALive - 8212

    Tree UVALive - 8212 题意: 有n个点,k个颜色,每个点都要被染色,相同颜色之间的边算是被该颜色覆盖,问有多少边被所有颜色覆盖 题解: 题目给的是无根树,我们可以将1默认为根然后求所 ...

  9. Rabbits UVALive - 8211

    Rabbits UVALive - 8211 题意: n个兔子的位置,兔子每次可以跳到两个兔子之间,问最多可以跳多少下? 题解: 求出所有相邻两数的间隔,然后减去最小间隔就是答案 代码: #inclu ...

  10. Little Boxes UVALive - 8209

    Little Boxes UVALive - 8209 题意: 给你四个数,输出四个数之和,四个数小于等于262之内 题解: 这...这..水题 unsigned int 0-4294967295 ( ...

最新文章

  1. 零基础参加java培训主要学什么
  2. Android的AutoCompleteTextView在API17高版本添加的setText函数在低版本系统居然能正常调用?官方文档是不是不靠谱了?...
  3. C#中对文件File常用操作方法的工具类
  4. mysql 一对多 关联一条最新的数据_不得不会的mysql锁
  5. 面向数据结构设计的基本思想
  6. pythonargmaxaxis1_np.argmax(input,axis)和tf.argmax(input,axis)使用
  7. duilib CPaintManagerUI的WM_PAINT消息
  8. 线程池拒绝策略-RejectedExecutionHandler
  9. windows上telnet用法 测试端口号
  10. console线驱动安装_低压灯带和高压灯带区别是啥 安装方法是啥?
  11. # 笔记2021-11
  12. 快应用采坑(3)-使用差别
  13. 数学建模学习(75):全局敏感性分析Morris 方法
  14. 攻防世界 reverse reverse-for-the-holy-grail-350
  15. 计算机更改锁屏密码忘记了怎么办,win10锁屏密码忘记了怎么办_w10忘记锁屏密码的处理步骤...
  16. styleSheets
  17. 五大存储模型关系模型 键值存储 文档存储 列式存储 图形数据库
  18. matlab bsxfun memory,matlab之bsxfun函数
  19. K8S 报错笔记--持续更新
  20. linux 第十一天 linuxprobe

热门文章

  1. 基于阿里云的移动客户端服务器架构图
  2. machine learning(8) -- classification
  3. [转]SQL Server 安全性概論與無法刪除資料庫使用者的解決辦法
  4. 京东联盟开发(10)——轮询获取数据
  5. java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~...
  6. ubuntu常见问题有效解决办法
  7. 祝刘冬冬十八周岁快乐
  8. Asp.Net MVC 控制器
  9. Jackrabbit介绍
  10. 关于下载 GAE High Replication Datastore 数据[实战篇]上