点此看题面

大致题意: 给你两个序列\(a,v\),其中\(a\)数组由\(0\sim m\)组成。随机用\(1\sim m\)中的一个数替换\(a\)中的\(0\),求\(\sum_{i=1}^{n-3}v_{gcd(a_i,a_{i+1},a_{i+2},a_{i+3})}\)的期望值。

记忆化搜索

考虑记忆化搜索,设\(f_{i,s_0,s_1,s_2}\)表示当前是第\(i\)位,前\(3,2,1\)个数的\(gcd\)分别是\(s_0,s_1,s_2\)时之后所有情况的元素乘积总和(求期望可以在记忆化搜索完后除以总方案数)。

则显然,设当前选择的数为\(t\),得到的值就是\(v_{gcd(s_0,t)}\cdot f_{i+1,gcd(s_1,t),gcd(s_2,t),t}\)。

由于对于\(1\sim100\)以内的四个数\(a,b,c,d\),满足\(a|b,b|c,c|d\)的情况数是非常少的(据说只有\(1500\)个左右),所以是能过的。

注意最好把记忆化数组中使用过的位置存下来,方便清空。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100
#define X 1000000007
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define Qinv(x) Qpow(x,X-2)
using namespace std;
int n,m,a[N+5],v[N+5],gcd[N+5][N+5];
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}
I int Gcd(CI x,CI y) {return y?Gcd(y,x%y):x;}
class MemorizedSearcher//记忆化搜索
{
private:
#define pb push_back
struct data
{
int id,s[3];I data(CI p=0,CI x=0,CI y=0,CI z=0):id(p),s({x,y,z}){}
I data operator + (CI y) Con {return data(id+1,gcd[s[1]][y],gcd[s[2]][y],y);}
};
int f[N+5][N+5][N+5][N+5];vector<data> vis;
I int dfs(Con data& x)//搜索
{
#define DFS(t) (1LL*(x.id>3?v[gcd[x.s[0]][t]]:1)*dfs(x+t)%X)//下一个状态
#define F(x) f[x.id][x.s[0]][x.s[1]][x.s[2]]//当前记忆化数组
if(x.id>n) return 1;if(F(x)) return F(x);vis.pb(x);//判断边界和已访问,开vector存储记忆化数组中使用过的位置
if(a[x.id]) return F(x)=DFS(a[x.id]);//如果已给定数字
for(RI i=1;i<=m;++i) Inc(F(x),DFS(i));return F(x);//枚举数字进行搜索
}
public:
I void Solve()
{
RI i,t=0;for(i=1;i<=n;++i) t+=!a[i];printf("%d\n",1LL*dfs(1)*Qinv(Qpow(m,t))%X);//求解并输出答案
for(t=vis.size(),i=0;i^t;++i) F(vis[i])=0;vis.clear();//清空
}
}M;
int main()
{
RI Tt,i,j;for(i=1;i<=N;++i) for(j=1;j<=N;++j) gcd[i][j]=Gcd(i,j);//初始化gcd
scanf("%d",&Tt);W(Tt--)
{
for(scanf("%d%d",&n,&m),i=1;i<=n;++i) scanf("%d",a+i);
for(i=1;i<=m;++i) scanf("%d",v+i);M.Solve();
}return 0;
}

【HDU6327】Random Sequence(记忆化搜索)的更多相关文章

  1. 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence

    题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...

  2. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  3. Topcoder SRM 656 (Div.1) 250 RandomPancakeStack - 概率+记忆化搜索

    最近连续三次TC爆零了,,,我的心好痛. 不知怎么想的,这题把题意理解成,第一次选择j,第二次选择i后,只能从1~i-1.i+1~j找,其实还可以从j+1~n中找,只要没有被选中过就行... [题意] ...

  4. UVA 10400 Game Show Math (dfs + 记忆化搜索)

    Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...

  5. UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)

     Stacking Boxes  Background Some concepts in Mathematics and Computer Science are simple in one or t ...

  6. 专题1:记忆化搜索/DAG问题/基础动态规划

      A OpenJ_Bailian 1088 滑雪     B OpenJ_Bailian 1579 Function Run Fun     C HDU 1078 FatMouse and Chee ...

  7. Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索

    Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...

  8. hdu 4111 Alice and Bob 记忆化搜索 博弈论

    Alice and Bob Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  9. poj1179 区间dp(记忆化搜索写法)有巨坑!

    http://poj.org/problem?id=1179 Description Polygon is a game for one player that starts on a polygon ...

随机推荐

  1. mac pe简单安装方法

    1.工具下载 TechTool Pro for mac V11.0.4:http://www.pc6.com/mac/112462.html 2.准备16g u盘 3.安装工具并按照注册码注册 在Te ...

  2. oracle使用sequence批量写数据

    本博客是对之前写的博客Oracle批量新增更新数据的补充,oracle的知识真是多,其实要学精任何一门知识都是要花大量时间的,正所谓: 学如逆水行舟,不进则退 先介绍oracle sequence的一 ...

  3. keepalived+Nginx实现主备保障Nginx的高可用。

    1.什么是keepalived? Keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障. Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工 ...

  4. 基于kafka_2.11-2.1.0实现的生产者和消费者代码样例

    1.搭建部署好zookeeper集群和kafka集群,这里省略. 启动zk: bin/zkServer.sh start conf/zoo.cfg. 验证zk是否启动成功: bin/zkServer. ...

  5. 如何查询正在运行的SQL Server agent job

    运行"msdb"系统数据库下的存储过程"dbo.sp_help_job",可以得知现在SQL Server中有多少个正在运行的agent job: USE [m ...

  6. Python urllib与requests、XML和HTMLParser

    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1019223241745024 Python 的内建模块urllib提供了一系列用于操作 ...

  7. Linux下java验证码不显示:Could not initialize class sun.awt.X11FontManager

    一.问题 javaweb项目,登录的时候有个图片验证码的功能.在Windows本地测试能够正常显示,部署到Linux上就不行了.报错如下: org.springframework.web.util.N ...

  8. 在 Docker 中已运行的 container 如何修改 run 时的 env

    https://www.cnblogs.com/xiaouisme/p/9837221.html 首先不推荐这样做,如需修改配置,应删掉重新部署. 其次,可以进行如下操作(未测试,不知道仅重启 con ...

  9. 搞NDK开发

    1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex, 加固,防逆向 签名校验 图片压缩 音视频解码 OpenGL ES 高级特效 热修复 andfix 人脸识别 fac ...

  10. Git内部原理浅析

    Git独特之处 Git是一个分布式版本控制系统,首先分布式意味着Git不仅仅在服务端有远程仓库,同时会在本地也保留一个完整的本地仓库(.git/文件夹),这种分布式让Git拥有下面几个特点: 1.直接 ...