BSOJ8163题解

看到值域很小而且时限 4s 以为是什么高明的依赖值域的复杂度,结果就是优化 DP。

考场上只想到了 O(n5) 的还是太菜了。

dp[l][r][x] 表示 [l,r] 这个区间中 x 赢得最终胜利的概率。容易有 O(n5) 转移。

但是很显然 x 左边的人不可能与右边的人对战,所以 [l,x][x,r] 这两个区间是完全独立的。

也就是说 dp[l][r][x]=F[l][x]×G[x][r]F[l][r] 表示 [l,r] 这个区间中 r 取得了最终的胜利,G[l][r] 定义相反。

转移:

F[l][r]=1rlk=lr1x=lkF[l][x]×G[x][k]×arax+ar×F[k+1][r]

G 类似。

f[l][r]=i=lrG[l][i]×F[i+1][r],那么有:

F[l][r]=1rlx=lr1F[l][x]×f[x][r]×arax+ar

没了。复杂度 O(n3)。注意边界。

#include<cstdio>
#include<cctype>
namespace SOLVE{
	typedef double db;
	const int M=505;
	int n,k,a[M];db F[M][M],G[M][M],H[M][M];
	inline void main(){
		scanf("%d%d",&n,&k);for(int i=1;i<=n;++i)scanf("%d",a+i),F[i][i]=G[i][i]=1;
		for(int t=2;t<=n;++t){
			for(int l=1,r=t;r<=n;++l,++r){
				for(int i=l;i<r;++i)H[l][r]+=G[l][i]*F[i+1][r];
				for(int i=l;i<r;++i)F[l][r]+=1.*a[r]/(a[i]+a[r])*F[l][i]*H[i][r];
				for(int i=r;i>l;--i)G[l][r]+=1.*a[l]/(a[i]+a[l])*H[l][i]*G[i][r];
				F[l][r]/=r-l;G[l][r]/=r-l;
			}
		}
		printf("%.10lf",F[1][k]*G[k][n]);
	}
}
signed main(){
	SOLVE::main();
}
posted @   Prean  阅读(63)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
var canShowAdsense=function(){return !!0};
点击右上角即可分享
微信分享提示