1. 程式人生 > >題目1255:骰子點數概率(動態規劃)

題目1255:骰子點數概率(動態規劃)

提交總是Wrong Answer,覺得自己的程式碼是沒有問題的,如4個骰子的和為4的情況只能有一個,就是4個全部為1

題意:給出n個骰子,計算所有骰子朝上一面的點數之和為S對應的概率

思路:用dp(i,j)表示i個骰子和為j時的概率,有dp(i,j)=(dp(i-1,j-1)+dp(i-1,j-2)+..+dp(i-1,j-6)) * pow(1.0/6, i)

程式碼如下:

import java.io.FileInputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.StreamTokenizer;

class Main
{
    private  boolean DEBUG = true;

    private  BufferedReader cin;
    private  PrintWriter cout;
    private int n, t = 0;
    private StreamTokenizer tokenizer;
    private int[][] dp = new int[1000 + 1][1000 * 6 + 1];

    private void init()
    {
        try {
            if (DEBUG) {
                cin = new BufferedReader(new InputStreamReader(new FileInputStream("d:\\OJ\\jiudu.txt")));
            } else {
                cin = new BufferedReader(new InputStreamReader(System.in));
            }

            tokenizer = new StreamTokenizer(cin);
            cout = new PrintWriter(new OutputStreamWriter(System.out));
            preprocess();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }

    private int next()
    {
        try {
            tokenizer.nextToken();
            if (tokenizer.ttype == StreamTokenizer.TT_EOF) return -1;
            else if (tokenizer.ttype == StreamTokenizer.TT_NUMBER) return (int)tokenizer.nval;
            else return -1;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return -1;
        }
    }

    private void preprocess()
    {
        for (int i = 1; i <= 6; i++)
        {
            dp[1][i] = 1;
        }

        for (int i = 2; i <= 1000; i++) {
            for (int j = i; j <= i * 6; j++) {
                for (int k = 1; k <= 6 && k < j; k++) {
                    dp[i][j] += dp[i - 1][j - k];
                }
            }
        }
    }

    private void solve()
    {
        if (t++ != 0) cout.println();

        double tmp = Math.pow(1.0 / 6, n);

        for (int i = n; i <= n * 6; i++) {
            cout.printf("%d: %.3f", i, tmp * dp[n][i]);
            cout.println();
        }
        cout.flush();

    }

    public void run()
    {
        init();

        while ((n = next()) > 0) {
            solve();
        }

    }

    public static void main(String[] args)
    {
        Main solver = new Main();
        solver.run();
    }
}


相關推薦

題目1255點數概率動態規劃

提交總是Wrong Answer,覺得自己的程式碼是沒有問題的,如4個骰子的和為4的情況只能有一個,就是4個全部為1 題意:給出n個骰子,計算所有骰子朝上一面的點數之和為S對應的概率 思路:用dp(i,j)表示i個骰子和為j時的概率,有dp(i,j)=(dp(i-1,j-1

九度 題目1255點數概率

題目描述: 把n個骰子扔在地上,所有骰子朝上一面的點數之和為S。輸入n,打印出S的所有可能的值出現的概率。 輸入: 輸入包括一個整數N(1<=N<=1000),代表有N個骰子。 輸出: 可能有多組測試資料,對於每組資料, 按照Sample Output的格

演算法導論-----最長公共序列LCS動態規劃

目錄 一.概念梳理   1. 子序列(subsequence): 一個特定序列的子序列就是將給定序列中零個或多個元素去掉後得到的結果(不改變元素間相對次序)。例如序列<A,B,C,B,D,A,B>的子序列有:<A,B>、&l

最大連續序列之和動態規劃

1. 問題描述 設n個元素的序列儲存在陣列A[0..n-1]中,求陣列中連續子序列之和的最大值。 2. 遞推公式 設All[i]為子問題A[i..n-1]的連續子序列之和的最大值,start[i]為從A[i]開始的連續序列之和的最大值,因此: All[i] = A[n-

九度 OJ 題目1008最短路徑問題 Dijstra 演算法

題目描述: 給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。 輸入: 輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為

動態規劃UVA-11400Lighting System Design

span design 依次 gin nbsp repl can lac ssi You are given the task to design a lighting system for a huge conference hall. After doing a lot

BZOJ2423 HAOI2010最長公共序列動態規劃

out color tchar efi turn name 子序列 lld 動態   大討論。註意去重。 #include<iostream> #include<cstdio> #include<cmath> #include<

HDU 1069 Monkey and Banana 最長上升序列進階動態規劃

HDU 1069(動態規劃) Monkey and Banana Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem Description A group

BZOJ4770 圖樣概率期望+動態規劃

很好 getc const con () stream lin 復雜度 turn   考慮求出所有MST的權值和再除以方案數,方案數顯然是2mn。   按位考慮,顯然應該讓MST裏的邊高位盡量為0。那麽根據最高位是0還是1將點集劃分成兩部分,整張圖的MST就是由兩部分各自的

NBUT魔法少女動態規劃

    https://ac.2333.moe/Problem/view.xhtml?id=1010 問題描述 前些時間虛淵玄的鉅獻小圓著實火了一把。 在黑長直(小炎)往上爬樓去對抗魔女之夜時,她遇到了一個問題想請你幫忙。 因為魔女之夜是懸浮在半空

NYOJ攔截導彈動態規劃

http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=79 描述 某國為了防禦敵國的導彈襲擊,發展中一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於等於前一發的高度。某天

矩陣最大累加和動態規劃

描述 給定一個由整陣列成二維矩陣(r*c),現在需要找出它的一個子矩陣,使得這個子矩陣內的所有元素之和最 大,並把這個子矩陣稱為最大子矩陣。例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩陣 為: 9 2 -4 1 -1 8 其

夜深人靜寫演算法——最長公共序列動態規劃

一. 問題描述 給定兩個字串,求解這兩個字串的最長公共子序列(Longest Common Sequence)。比如字串1:BDCABA;字串2:ABCBDAB 則這兩個字串的最長公共子序列長度為4,最長公共子序列是:BCBA 二.尋找最優子結構, 用dp[i][j]

最大子序列、最長連續公共連續、最長公共序列動態規劃

原文連結:http://blog.sina.com.cn/s/blog_54f82cc20100zi4b.html 最大子序列 最大子序列是要找出由陣列成的一維陣列中和最大的連續子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,達到最大;而 {5,-6

最長公共序列動態規劃

目錄 2  問題描述 1 子序列概念 一個給定序列的子序列是在序列中刪除若干個元素後得到的序列。在這裡,首先說明子序列的概念(切記子序列非子集的概念),例如是序列的一個子序列,則序列在序列中相對應的下標為,序列和的下標都是從1開始。 2  問題

最長遞增序列,最長,進一步要給出一個序列動態規劃

牛客網 給定一個長度為N的陣列,找出一個最長的單調自增子序列(不一定連續,但是順序不能亂) 例如:給定一個長度為8的陣列A{1,3,5,2,4,6,7,8},則其最長的單調遞增子序列為{1,2,4,6,7,8},長度為6. 輸入描述 第一行包含一

最長遞增序列動態規劃

acc mage ios 數據 mes eth 遞增 整數 inpu 題目描述 有n個互不相同的整數an若存在一個數列bm其中對於任何1 < i < m滿足bi < bi+1 且 abi < abi+1則稱abn為an的一個遞增子序列試求出給

leetcode5. 最長迴文動態規劃

給定一個字串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度為1000。 示例 1: 輸入: "babad" 輸出: "bab" 注意: "aba"也是一個有效答案。 示例 2: 輸入: "cbbd" 輸出: "bb" 解題思路: 採用動態規劃的

【LOJ#6074】序列動態規劃

【LOJ#6074】子序列(動態規劃) 題面 LOJ 題解 考慮一個暴力\(dp\)。 設\(f[i][c]\)表示當前在第\(i\)位,並且以\(c\)結尾的子序列個數。 那麼假設當前位為\(a\),強制把\(a\)接在所有出現過的子序列後面,再加上一個單獨的\(a\)。 也就是\(f[i][a]=

Prince and Princess最長公共序列優化,動態規劃

<a target=_blank href="https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&