点此看题面

大致题意: 给你两个序列\(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. ThreadLocal 简单解析

    ThreadLocal 简单解析 基于jdk1.8 ThreadLocal一定不陌生,开发中常用,也是面试里的常客了,但是往往我们可能只是知道该类的作用.学习该类对于个人的多线程编码能力是大有裨益的, ...

  2. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  3. 海边拾贝-B-优秀博客/网站

    记下若干优秀博客,方便后期检索.会不定期更新: 优秀的程序员,从使用Github开始:https://help.github.com/en/github/managing-your-work-on-g ...

  4. linux软链接

    这是linux中一个非常重要的命令,他的功能是为某一个文件在另一个位置建立一个同步的链接,这个命令最常用的参数是-s, 具体用法是: ln -s 源文件 目标文件 当我们需要在不同的目录,用到相同的文 ...

  5. Java 银联云闪付对接记录

    一开始盲目找资料走了弯路: 还是从银联给的官方文档入手最高效: 附件3:云闪付业务商户入网服务指引.pdf http://tomas.test.upcdn.net/pay/%E9%99%84%E4%B ...

  6. Chrome 手动安装.crx插件

    在网上自己下载.crx的离线插件文件.或者通过朋友打包.crx文件.打包方式可参照Chrome 打包扩展程序 方法一: 打开Chrome浏览器,地址栏输入 chrome://extensions/ 将 ...

  7. nginx的6种负载均衡策略

    在服务器集群中,Nginx起到一个反向代理服务器的作用.为了避免单独一个服务器压力过大导致服务器奔溃,就需要将不同用户的请求转发给不同给不同的服务器,保证集群中的每一台服务器都能正常运作,这种机制就叫 ...

  8. 一行 Python

    很多人学Python,除了它功能强大,简单易学外,代码行数少.语法简洁也是很吸引人的地方.那么,Python的语法到底有多简洁呢?一行Python代码,能实现什么丧心病狂的功能呢? 1.一行代码,实现 ...

  9. 使用highcharts实现无其他信息纯趋势图实战实例

    使用highcharts实现无其他信息纯趋势图实战实例 Highcharts去掉或者隐藏掉y轴的刻度线yAxis : { gridLineWidth: 0, labels:{ //enabled:fa ...

  10. bat延迟执行脚本,利用choice实现定时执行功能

    choice是选择语句,具体语法另外再讲.今天利用它来实现定时执行功能.废话少说直接上代码: 示例一: @echo off for %%a in (我 是 一 个 中 国 人) do ping -n ...