• HDU 4487 Maximum Random Walk


    Maximum Random Walk

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 756    Accepted Submission(s): 419

    三维dp,一维的话根本没有办法开展,二维的话没办法保存当前位置或者最远位置,所以只能用三维的。

    看不懂滚动数组之类的操作,只能傻傻的写。

    具体内容在代码里标注了,三重循环,从i,j,k的状态递推它之后的状态。

    在我看来,递推DP有两种,一种是从当前状态推出其他状态,一种是推导当前状态是怎么来的。

    这个题只能写前者,因为如果写后者的话,K的更新比较麻烦,不好处理。

    上一个题写后者就比较容易,还是得做题体会吧。。。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define mem(a,b) memset(a,b,sizeof(a))
     4 #define ll long long
     5 #define inf 1000000000
     6 #define maxn 300
     7 #define maxm 100005
     8 #define eps 1e-10
     9 #define for0(i,n) for(int i=1;i<=(n);++i)
    10 #define for1(i,n) for(int i=1;i<=(n);++i)
    11 #define for2(i,x,y) for(int i=(x);i<=(y);++i)
    12 #define for3(i,x,y) for(int i=(x);i>=(y);--i)
    13 #define mod 1000000007
    14 inline int read()
    15 {
    16     int x=0,f=1;char ch=getchar();
    17     while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    18     while(ch>='0'&&ch<='9') {x=10*x+ch-'0';ch=getchar();}
    19     return x*f;
    20 }
    21 float dp[101][201][201];//表示走了i步后到达j点b并且最远达到k的概率
    22 //什么时候考虑这个状态向外发散,什么时候考虑这个状态由其他几个状态飞来
    23 int main()
    24 {
    25     int T;
    26     while(~scanf("%d",&T))
    27     {
    28         for(int i=1;i<=T;++i)
    29         {
    30             int index=read();
    31             mem(dp,0);
    32             printf("%d ",index);
    33             int n=read();
    34             double pl,pr;
    35             scanf("%lf%lf",&pl,&pr);
    36             double pk=1-pl-pr;
    37             dp[0][100][100]=1;
    38             int l=100-n,r=100+n;
    39             for(int j=0;j<n;++j)//考虑的是,从j,k,h走向下一步的所有可能
    40              for(int k=l;k<=r;++k)
    41               for(int h=100;h<=100+n;++h)
    42                {
    43                    dp[j+1][k][h]+=dp[j][k][h]*pk;
    44                    dp[j+1][k-1][h]+=dp[j][k][h]*pl;
    45                    if(k+1>h) dp[j+1][k+1][k+1]+=dp[j][k][h]*pr;
    46                    else dp[j+1][k+1][h]+=dp[j][k][h]*pr;
    47                }
    48             double ans=0;
    49             for(int j=l;j<=r;++j)
    50               for(int k=100;k<=r;++k)
    51                 ans+=(k-100)*dp[n][j][k];
    52             printf("%.4lf
    ",ans);
    53         }
    54     }
    55 }
    56  
  • 相关阅读:
    cocos2dx CCSprite自动拉伸全屏
    linux 安装输入法
    linux jdk 配置
    Proguard.cfg 配置
    C++基本概念
    查看android keystore 别名
    view onTouch,onClick,onLongClick
    LiteDB V4.1.4版本 查询日期写法 C#
    解决Highcharts 5.0.7,IE8下bar类型图表无法显示的问题
    AspNetCore AmbiguousMatchException: The request matched multiple endpoints. Matches
  • 原文地址:https://www.cnblogs.com/TYH-TYH/p/9408996.html
Copyright © 2020-2023  润新知