码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 3329

时间:2014-11-19 12:09:48      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:blog   io   os   sp   for   on   div   log   amp   

方程很明显有

d[i]=sum(pk*d[i+k])+p0*d[0];

其中pi可以在开始时枚举求出。

设d[i]=A[i]*d[0]+B[i],

代入上式

d[i]=(sum(pk*A[i+k])+p0)+sum(pk*B[i+k])+1

可得

A[i]=sum(pk*A[i+k])+p0

B[i]=sum(pk*B[i+k])+1

这种设系数方法好像挺常用挺经典的。在HDU 的MAZE也有用这种方法的。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

double A[600],B[600];
double p[20];

int main(){
	int T;
	int n,k1,k2,k3,a,b,c;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
		memset(p,0,sizeof(p));
		double p0=1.0/(k1*k2*k3);
		for(int i=1;i<=k1;i++){
			for(int j=1;j<=k2;j++){
				for(int k=1;k<=k3;k++)
				if(i==a&&j==b&&k==c)
				continue;
				else p[i+j+k]+=p0;
			}
		}
		memset(A,0,sizeof(A));
		memset(B,0,sizeof(B));
		for(int i=n;i>=0;i--){
			A[i]=p0;B[i]=1;
			for(int j=1;j<=k1+k2+k3;j++){
				A[i]+=p[j]*A[i+j];
				B[i]+=p[j]*B[i+j];
			}
		}
		printf("%.15lf\n",B[0]/(1-A[0]));
	}
	return 0;
}

  

ZOJ 3329

标签:blog   io   os   sp   for   on   div   log   amp   

原文地址:http://www.cnblogs.com/jie-dcai/p/4107626.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!