HDU 5001 概率DP || 记忆化搜索

时间:2022-07-01 14:04:37

2014
ACM/ICPC Asia Regional Anshan Online

给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率

概率DP  測试数据太水了。。。。10000*50*50*50HDU 5001 概率DP || 记忆化搜索都能过

加个vector优化到HDU 5001 概率DP || 记忆化搜索

#include "stdio.h"
#include "string.h"
#include "vector"
using namespace std; double dp[10][101][101];
double ans[101];
vector<int>map[101];
int cnt[101];
int main()
{
int n,m,d,Case,a,b,i,j,k,l;
scanf("%d",&Case);
while (Case--)
{
scanf("%d%d%d",&n,&m,&d);
memset(cnt,0,sizeof(cnt));
while (m--)
{
scanf("%d%d",&a,&b);
cnt[a]++;
cnt[b]++;
map[a].push_back(b);
map[b].push_back(a);
}
memset(dp,0,sizeof(dp)); for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i!=j)
dp[0][i][j]+=1.0/n; // dp[d][i][j] 第d步,终点为i,中途不经过j的概率 for (i=1;i<=d;i++)
{
memset(dp[i%2],0,sizeof(dp[i%2]));
for (j=1;j<=n;j++)
for (k=0;k<map[j].size();k++)
for (l=1;l<=n;l++)
if (j!=l && j!=map[j][k])
dp[i%2][map[j][k]][l]+=dp[1-i%2][j][l]*1.0/cnt[j];
}
memset(ans,0,sizeof(ans));
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
if (i!=j)
ans[i]+=dp[d%2][j][i];
for (i=1;i<=n;i++)
{
printf("%.10lf\n",ans[i]);
map[i].clear();
}
}
return 0;
}

记忆化搜索: 每次去掉一个点,然后对剩下的点进行记忆化搜索

#include "stdio.h"
#include "string.h"
#include "vector"
using namespace std; int vis[101][10011],cnt[101];
double dp[101][10011];
int d;
vector<int>map[101];
double dfs(int a,int b,int c) //当前在a点,已经走了b步,不经过c点
{
int i;
double ans;
if (vis[a][b]) return dp[a][b];
vis[a][b]=1;
ans=0;
if (b>d) return dp[a][b]=1;
for (i=0;i<map[a].size();i++)
if (map[a][i]!=c)
ans+=1.0/cnt[a]*dfs(map[a][i],b+1,c);
return dp[a][b]=ans; } int main()
{
int Case,n,m,i,a,b;
scanf("%d",&Case);
while (Case--)
{
scanf("%d%d%d",&n,&m,&d);
memset(cnt,0,sizeof(cnt));
for (i=0;i<=n;i++)
map[i].clear();
while (m--)
{
scanf("%d%d",&a,&b);
cnt[a]++;
cnt[b]++;
map[a].push_back(b);
map[b].push_back(a);
}
memset(dp,0,sizeof(dp));
for (i=1;i<=n;i++)
map[0].push_back(i);
cnt[0]=n; for (i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
printf("%.10lf\n",dfs(0,0,i));
}
}
return 0;
}

HDU 5001 概率DP || 记忆化搜索的更多相关文章

  1. HDU - 5001 Walk(概率dp&plus;记忆化搜索)

    Walk I used to think I could be anything, but now I know that I couldn't do anything. So I started t ...

  2. Codeforces 148D Bag of mice:概率dp 记忆化搜索

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 一个袋子中有w只白老鼠,b只黑老鼠. 公主和龙轮流从袋子里随机抓一只老鼠出来,不放回,公 ...

  3. CodeForces 398B 概率DP 记忆化搜索

    题目:http://codeforces.com/contest/398/problem/B 有点似曾相识的感觉,记忆中上次那个跟这个相似的 我是用了 暴力搜索过掉的,今天这个肯定不行了,dp方程想了 ...

  4. hdu3559 Frost Chain &lpar;概率dp&plus;记忆化搜索&rpar;

    Problem Description In the unimaginable popular DotA game, the hero Lich has a wonderful skill: Fros ...

  5. 【bzoj5123】&lbrack;Lydsy12月赛&rsqb;线段树的匹配 树形dp&plus;记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  6. 【BZOJ】1415 &lbrack;Noi2005&rsqb;聪聪和可可 期望DP&plus;记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  7. &lbrack;题解&rsqb;(树形dp&sol;记忆化搜索)luogu&lowbar;P1040&lowbar;加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  8. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  9. 状压DP&plus;记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

随机推荐

  1. JavaScript 中的原型声明和用法总结

    下面是自己写的一个关于js的拖拽的原型声明:代码如下 需要注意的问题包括: 1.this的指向到底是指向谁--弄清楚所指的对象 2.call()方法的使用 3.直接将父级原型赋给子级与使用for将其赋 ...

  2. Matlab中的数据类型

    Matlab中有15种基本数据类型,主要是整型.浮点.逻辑.字符.日期和时间.结构数组.单元格数组以及函数句柄等.         1.整型:(int8:uint8:int16:uint16:int3 ...

  3. BZOJ 1269 文本编辑器 Splay

    题目大意:维护一个文本编辑器,支持下列操作: 1.将光标移动到某一位置 2.在光标后插入一段字符串 3.删除光标后的一段字符 4.翻转光标后的一段字符 5.输出光标后的一个字符 6.光标-- 7.光标 ...

  4. 阻塞队列BlockingQueue

    BlockingQueue最终会有四种状况,抛出异常.返回特殊值.阻塞.超时,下表总结了这些方法: 抛出异常 特殊值 阻塞 超时 插入 add(e) offer(e) put(e) offer(e, ...

  5. thinkPHP中&lowbar;initialize方法实例分析

    子类的_initialize方法自动调用父类的_initialize方法. 而php的构造函数construct,如果要调用父类的方法,必须在子类构造函数显示调用parent::__construct ...

  6. define和typedef的区别

    define和typedef的区别 define是单纯的字符替换,typedef是重新定义了新的类型 #include <stdio.h> #define CHAR1 char* type ...

  7. Linux基础(一)系统api与库函数的关系

    1. 系统api与库函数的关系 man 2 open 1.1 open 1.2 read/write 实现cat功能 #include <stdio.h> #include <uni ...

  8. 【VS2015】关于VS2015如何运行的问题

    各位看官,lt's been a long time since we met last time. 是否习惯了CodeBlocks那种简易编写C文件?一到写工程就懵逼的状态?今天我给他们带来如何让C ...

  9. 解决robotframework安装时提示wxPython not found问题

    背景:想把现在pc的项目做成关键字的形式,可以让功能测试人员也参与到自动化测试中,于是就找到robotframework这个框架,试用下怎么样,在安装时就遇到很多问题,安装的帖子有很多,很详细,如:h ...

  10. 火柴排队(NOIP2013)(附树状数组专题讲解(其实只是粗略。。。))

    原题传送门 首先,这道题目是一道神奇的题. 看到这道题,第一眼就觉得2个数组排个序,然后一一对应的时候一定差值最小. 由于我们可以将这2个数列同时进行调换. 所以我们先把2个数列排个序. 第二个序列中 ...