糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 3519 Minimal Backgammon 动态规划

思路:

方程:
f[i][j] = { 还剩 i 次投 dice 的机会,此时位于第 j 个格子。这种情况下赢的概率 }

状态转移:
现在投 dice。分别考虑投到 1~6 的情况,假设最后停在 k 点。
如果 k 点是 L 点。则概率 g = f[i - 2][j]
如果 k 点是 B 点。则概率 g = f[i - 1][0]
如果 k 点是一个普通的点,则概率 g = f[i - 1][j]
f[i][j] = g[1]/6 + g[2]/6 + ... + g[6]/6

代码:

#include <stdio.h>
#include 
<string.h>

double prob[3][128], *p[3];
int N, T, L, B;
char map[128];

inline 
double calc(int x)
{
    
switch (map[x]) {
    
case 'B'return p[1][0];
    
case 'L'return p[0][x];
    
default : return p[1][x];
    }

}


int main()
{
    
int i, j, c, x;

    freopen(
"e:\\test\\in.txt""r", stdin);

    
while (scanf("%d%d%d%d"&N, &T, &L, &B), N) {
        memset(map, 
' 'sizeof(map));
        memset(prob, 
0sizeof(prob));
        
while (L--{
            scanf(
"%d"&i);
            map[i] 
= 'L';
        }

        
while (B--{
            scanf(
"%d"&i);
            map[i] 
= 'B';
        }

        
//prob[1][N] = 1;
        for (i = 0; i < T; i++{
            p[
2= prob[(i+2)%3];
            p[
1= prob[(i+1)%3];
            p[
0= prob[i%3];
            p[
1][N] = 1;
            
for (j = 0; j < N; j++{
                p[
2][j] = 0;
                
for (c = 6, x = j + 1; c && x < N; c--, x++)
                    p[
2][j] += calc(x) / 6;
                
for ( ; c; c--, x--)
                    p[
2][j] += calc(x) / 6;
            }

        }

        printf(
"%.6lf\n", p[2][0]);
    }


    
return 0;
}

posted on 2010-04-21 21:57 糯米 阅读(347) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理