程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 4405 Aeroplane chess 概率dp

HDU 4405 Aeroplane chess 概率dp

編輯:C++入門知識

HDU 4405 Aeroplane chess 概率dp


題目大意: 跳棋有0~n個格子,每個格子X可以搖一次色子,色子有六面p(1= 能確定的狀態就是最終n-n+5這6個點的步數是0 然後從後往前遞推
#include 
#include 
#include 
#include 
#include 
#include 
#include 
template 
inline bool rd(T &ret) {
    char c; int sgn;
    if(c=getchar(),c==EOF) return 0;
    while(c!='-'&&(c<'0'||c>'9')) c=getchar();
    sgn=(c=='-')?-1:1;
    ret=(c=='-')?0:(c-'0');
    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');
    ret*=sgn;
    return 1;
}
template 
inline void pt(T x) {
    if (x <0) {
        putchar('-');
        x = -x;
    }
    if(x>9) pt(x/10);
    putchar(x%10+'0');
}
using namespace std;
typedef long long ll;
const int N = 100010;
int n, m;
double dp[N];
int to[N];
double solve(){
	for(int i = 0; i < 6; i++)
		dp[i+n] = 0;
	for(int i = n-1; i >= 0; i--)
	{
		if(to[i]!=-1)
			dp[i] = dp[to[i]];
		else {
			dp[i] = 1.0;
			for(int j = 1; j <= 6; j++)
				dp[i] += dp[i+j] / 6.0;
		}
	}
	return dp[0];
}
void input(){
	memset(to, -1, sizeof to);
	while(m--){
		int x, y;rd(x); rd(y);
		to[x] = y;
	}
	for(int i = n-1; i >= 0; i--){
		if(to[i] == -1)continue;
		if(to[to[i]] != -1)
		to[i] = to[to[i]];
	}
}
int main() {
	while(cin>>n>>m, n+m){
		input();
		printf("%.4f\n", solve());
    }
    return 0;
}
/*


*/


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved