多校5 1001 HDU5781 ATM Mechine 记忆化搜索+概率

 1 // 多校5 1001 HDU5781 ATM Mechine
 2 // http://acm.hdu.edu.cn/search.php?field=problem&key=2016+Multi-University+Training+Contest+5&source=1&searchmode=source
 3 // 记忆化搜索
 4 // 每次二分,决策最优,所以最多查询11次
 5 // dp[i][j] 当前能确定i元情况下,还能被警告j次
 6 // 下次取k,实际剩余t
 7 // dp[i][j]=min(1≤k≤i)({(∑(0≤t<k)dp[k?1][j-1]+∑(k≤t≤i)dp[i?k][j])/(i+1)})+1=(min(1≤k≤i){k*dp[k?1][j-1]+(i?k+1)*dp[i?k][j]})/(i+1)+1
 8 // k=0 没有钱可以取,当然次数为0
 9 // w=0 这种情况要排除
10 // w=1 最后只能1块的取,直到取完,警告没有钱可以取了
11
12
13 // #pragma comment(linker, "/STACK:102c000000,102c000000")
14 #include <iostream>
15 #include <cstdio>
16 #include <cstring>
17 #include <sstream>
18 #include <string>
19 #include <algorithm>
20 #include <list>
21 #include <map>
22 #include <vector>
23 #include <queue>
24 #include <stack>
25 #include <cmath>
26 #include <cstdlib>
27 // #include <conio.h>
28 using namespace std;
29 #define clc(a,b) memset(a,b,sizeof(a))
30 const double inf = 0x3f3f3f3f;
31 #define lson l,mid,rt<<1
32 // #define rson mid+1,r,rt<<1|1
33 const int N = 2010;
34 const int M = 1e6+10;
35 const int MOD = 1e9+7;
36 #define LL long long
37 #define LB long double
38 // #define mi() (l+r)>>1
39 double const pi = acos(-1);
40 const double eps = 1e-8;
41 void fre(){freopen("in.txt","r",stdin);}
42 inline int read(){int x=0,f=1;char ch=getchar();while(ch>‘9‘||ch<‘0‘) {if(ch==‘-‘) f=-1;ch=getchar();}while(ch>=‘0‘&&ch<=‘9‘) { x=x*10+ch-‘0‘;ch=getchar();}return x*f;}
43
44 double dp[2010][11];
45 bool vis[2010][11];
46 double dfs(int k,int x){
47     double ans=inf;
48     if(k==0) return 0;
49     if(x==0) return inf;
50     if(x==1) return (double)((1 + k + 1) * (k + 1) / 2 - 1) / (k + 1);
51     if(vis[k][x]) return dp[k][x];
52     for(int i=1;i<=k;i++){
53        ans=min(ans,1.0*(k-i+1)/(k+1)*dfs(k-i,x)+1.0*i/(k+1)*dfs(i-1,x-1)+1);
54     }
55     vis[k][x]=true;
56     return dp[k][x]=ans;
57 }
58
59 int main(){
60     int k,w;
61     while(~scanf("%d%d",&k,&w)){
62         double ans=dfs(k,min(w,11));
63         printf("%.6f\n",ans);
64     }
65     return 0;
66 }
时间: 2024-11-05 23:37:23

多校5 1001 HDU5781 ATM Mechine 记忆化搜索+概率的相关文章

BZOJ.2246.[SDOI2011]迷宫探险(DP 记忆化搜索 概率)

题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在陷阱未知时需要知道当前状态这个陷阱为有害/无害的概率,并用这两个概率相加. 如何求某个状态下未知陷阱是否有害的概率呢(以下求有害概率,即 有害/(有害+无害)) DFS枚举每个陷阱已知有害/无害/未知的状态,我们需要处理未知陷阱在该状态下的概率. 枚举每个未知的陷阱,再枚举2^K的概率数组,只有当满

sicily 1176. Two Ends (Top-down 动态规划+记忆化搜索 v.s. Bottom-up 动态规划)

DescriptionIn the two-player game "Two Ends", an even number of cards is laid out in a row. On each card, face up, is written a positive integer. Players take turns removing a card from either end of the row and placing the card in their pile. T

POJ 3249 Test for Job (记忆化搜索 好题)

Test for Job Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9512   Accepted: 2178 Description Mr.Dog was fired by his company. In order to support his family, he must find a new job as soon as possible. Nowadays, It's hard to have a job

sicily 1219(记忆化搜索)

题目链接:sicily 1214 解题思路: 博弈题,用搜索来做.但是,如果用普通的搜索来做的话,是会超时的--复杂度大约是O( n^n ),所以需要采用记忆化搜索的方法(其实差不多就是动态规划了,但是这里是树形DP). 状态: 用集合S表示现在树的状态,i 表示现在轮到谁进行砍边,dp[ S ][ i ]表示最优值.集合S可以用二进制来表示,即001表示现在还剩下第0条边. 状态转移: 1)A的目标是取最大值,B的目标是取最小值,我们在推导当前状态的最优解时,需要分两种情况考虑!即A得维护较大

HDU 1513 Palindrome:LCS(最长公共子序列)or 记忆化搜索

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1513 题意: 给你一个字符串s,你可以在s中的任意位置添加任意字符,问你将s变成一个回文串最少需要添加字符的个数. 题解1(LCS): 很神奇的做法. 先求s和s的反串的LCS,也就是原串中已经满足回文性质的字符个数. 然后要变成回文串的话,只需要为剩下的每个落单的字符,相应地插入一个和它相同的字符即可. 所以答案是:s.size()-LCS(s,rev(s)) 另外,求LCS时只会用到lcs[i-

uva 1076 - Password Suspects(AC自动机+记忆化搜索)

题目链接:uva 1076 - Password Suspects 题目大意:有一个长度为n的密码,存在m个子串,问说有多少种字符串满足,如果满足个数不大于42,按照字典序输出. 解题思路:根据子串构建AC自动机,然后记忆化搜索,dp[i][u][s]表示第i个字符,在u节点,匹配s个子串. #include <cstdio> #include <cstring> #include <queue> #include <string> #include <

poj 1579(动态规划初探之记忆化搜索)

Function Run Fun Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17843   Accepted: 9112 Description We all love recursion! Don't we? Consider a three-parameter recursive function w(a, b, c): if a <= 0 or b <= 0 or c <= 0, then w(a, b

记忆化搜索,FatMouse and Cheese

1.从gird[0][0]出发,每次的方向搜索一下,每次步数搜索一下 for(i=0; i<4; i++) { for(j=1; j<=k; j++) { int tx=x+d[i][0]*j; int ty=y+d[i][1]*j; if(tx>=0&&tx<n&&ty>=0&&ty<n&&grid[x][y]<grid[tx][ty]) { int temp=memSearch(tx,ty); i

LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)

题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多. 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以看到信息. 然后SCC缩点后就形成DAG,直接记忆化搜索,d(u)搜索从u点出发开始传最多能传多少人. 最后就是找答案了. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namesp