Millionaire(2008 APAC local onsites c)

---恢复内容开始---

题意:最开始你有x元钱,要进行M轮赌博。每一轮赢的概率为P,你可以选择赌与不赌,如果赌也可以将所持的任意一部分钱作为赌注(可以是整数,也可以是小数)。如果赢了,赌注将翻倍;输了赌注则没了。在M轮赌博结束后,如果你持有的钱在100万元以上,就可以把这些钱带回家。问:当你采取最优策略时,获得100万元以上的钱并带回家的概率是多少。

类型:动态规划&离散化思想

分析:由于每一轮的赌注是任意的,不一定为整数,因而有无限种可能,所以即便想穷竭搜索也无从着手。但如果能化连续为离散,那么可能便也是有限的了。具体如下:假设前M-1轮的赌博后,还持有x‘元。对于最后一轮,考虑的情况有3种。如果x‘ >= 100万,则没有必要再赌了即最后一轮赢的概率为0;如果50<= x‘ < 100万,只要参与赌博并且赌注 >= 50万则有赢的概率为P;如果x‘ < 50万,那么无论是否参与最后一轮的赌博,压的赌注是多少赢的概率必为0。我们不妨看一下倒数第二轮与最后一轮的关系,设在倒数第二轮时持有的钱为x。如果x >= 100万,赢的概率为1;如果x < 25万,即便最后两轮赌博都赢了总钱数必小于100万,所以赢的概率为0;否则,只要选择参与至少一轮赌博并且赌注至少25万则有赢得概率。假设倒数第二轮的赌注为y(y = 0 或 y >= 25万),则最后一轮持有的钱x‘ = (x + y)或x‘ = (x - y)。而倒数第二轮考虑的情况具体可以分为5种。综上,当参与M轮赌博时所需考虑的情况总共有2^m + 1种,可以通过dp解决。定义一个二维dp数组,dp[i][j] := 参与第i轮赌博,持有的钱所在模块为j并且采取最优策略时赢的概率。初始化:dp[n][1 << m] = 1,状态转移方程dp[i][j] = max(P * dp[i + 1][j + k] + (1 - P) * dp[i + 1][j - k] / 0 <= k <= min(j, n - j) )。时间复杂度O(m*2^2m)。

//代码实现:已通过滚动数组循环利用完成空间复杂度的优化

#include <iostream>
#include <memory.h>
#include <algorithm>
#include <cstdio>
using namespace std;

int M , X; 
double P; 
double dp[2][(1 << 15) + 1];

void solve() 

   int n = 1 << M;  
     double *pre = dp[0] , *nxt = dp[1];  
   memset(pre , 0 , sizeof(double) * (n + 1));  
   pre[n] = 1.0;//因:模块n对应的资金>= 100万
     for(int r = 0 ; r < M; r++) 
     { 
     for(int i = 0 ; i <= n ; i++)   
     { 
            int step = min(i , n - i);//避免i + j > n
            double t = 0.0;

     for(int j = 0 ; j <= step ; j++)      
        t = max(t , P * pre[i + j] + (1 - P) * pre[i - j]);//进行m轮赌博,最小赌资应为 100万/n  
       nxt[i] = t;//以模块i的资金进行r + 1轮赌博,赢的最大概率
     }  
      swap(pre , nxt);  
   }  
   int i = X * n / 1000000;//资金X所在模块
   printf("%.6lf\n" , pre[i]); 
}

int main()
{
   cin >> M >> P >> X;
   solve();
   return 0;
}

---恢复内容结束---

时间: 2024-10-07 23:09:22

Millionaire(2008 APAC local onsites c)的相关文章

Code Jam 2008 APAC local onsites Problem C. Millionaire —— 概率DP

题意: 你有X元钱,进行M轮赌博游戏.每一轮可以将所持的任意一部分钱作为赌注(赌注为0元表示这一轮不押),赌注可以是小数的,不是一定要整数.每一轮 赢的概率为P,赢了赌注翻倍,输了赌注就没了.如果你最后持有至少1000000元钱的话,就可以把钱全部带走.要求计算在采取最优策略时,获得至少 1000000元钱的概率. 数据范围: 0<=P<=1 1<=X<=1000000 1<=M<=15 1 int M , X ; 2 double P; 3 double dp[2][

WPF PRISM开发入门一

这篇博客将介绍在WPF项目中引入PRISM框架进行开发的一些基础知识.目前最新的PRISM的版本是Prism 6.1.0,可以在Github上获取PRISM的源码.这个系列的博客将选择PRISM 4.1版本来讲解.可以从微软官网上下载到PRISM 4.1相关内容.将下载下来的文件解压开: 新建一个WPF解决方案如下: 解决方案中包含两个工程,GetStartedPrismWPF是一个WPF项目,GetStartedPrismWPF.MainModule是一个类库项目.这两个项目中都同时添加下面P

【UWP】FlipView绑定ItemsSource,Selectedindex的问题

最近在做列表头部的Carousel展示,Carousel使用的是FlipView展示,另外使用ListBox显示当前页,如下图 我们先设置一个绑定的数据源 public class GlobalResource : INotifyPropertyChanged { private ObservableCollection<string> _items; public ObservableCollection<string> Items { get { return _items =

添加条码生成和打印功能到SQL Server Reporting Services report 中

Barcode Professional for Reporting Services 是一款灵活和强大的.NET组件(.NET DLL 类库),它让您轻松地添加条码生成和打印功能到您的SQL Server Reporting Services report 中.支持几乎所有当前常用的条码:Code 39, Code 128, GS1-128, GS1 DataBar (RSS-14), EAN 13 & UPC, Postal (USPS, British Royal Mail, Austra

在WPF中使用CefSharp嵌入浏览器

日常开发中,我们需要将一些Web页面嵌入到桌面客户端软件中.下面我们使用CefSharp嵌入浏览器来实现. 首先先介绍一下CefSharp嵌入式浏览器,它是基于Google浏览器的一个组件,我们可以在WPF/WinForm客户端软件中使用它.CefSharp的代码托管在GitHub上,.NET (WPF and Windows Forms) bindings for the Chromium Embedded Framework. 目前最新版本的CefSharp是41.0版本,如果你的客户端软件

WPF Navigation

在开始学习WPF时,一开始对WPF的Window, Page, UserControl感到很迷惑.不知道什么时候该使用哪一个.下面简单介绍一下这三者的区别. Window:故名思意,桌面程序的窗体.在WPF桌面应用中,我通常会只用一个主窗体,然后将不同的操作单元封装在不同的UserControl中,根据用户的操作展现不同的UserControl: Page:Page需要承载在窗体中,通过Navigation进行不同Page的切换,也是本篇博客中需要讲到的: UserControl:封装一些可以重

高质量的基于向量条形码产生机制 WPF Drawing API条形码控件

Barcode Professional for WPF条形码控件是一款轻量级的 .NET 程序集,为你的WPF程序生成高质量的基于矢量的条码,支持大多数流行的一维和二维条形码:Code 39, Code 128, GS1-128, GS1 DataBar (RSS-14),  EAN 13 & UPC, Postal (USPS, British Royal Mail, Australia Post, DHL, etc.), Data Matrix, QR Code, PDF 417, UPS

数据绑定—Source(绑定到静态类的静态属性)

<UserControl x:Class="绑定.绑定Source" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibil

Barcode Professional for ASP.NET ASP.NET条码生成和打印功控件介绍

Barcode Professional for ASP.NET是最灵活和强大的.NET组件(.NET DLL 类库),它让您轻松地添加先进的条码生成和打印功能到您的ASP.NET Web解决方案(包括ASP.NET Mobile Web站点). 具体功能: Neodynamic Barcode Professional for ASP.NET是最灵活和强大的.NET组件(.NET DLL 类库),它让您轻松地添加先进的条码生成和打印功能到您的ASP.NET Web解决方案(包括ASP.NET