BZOJ4832 [Lydsy2017年4月月賽]抵制克蘇恩

naive dp:f[x][y][i][j][l]表示當前發動了x輪攻擊,打中英雄y次,場上三種血量的奴隸主數量分別爲i,j,k

香港記者dp:f[x][i][j][k]表示欽定發動了x輪攻擊,場上三種血量的奴隸主數量分別爲i,j,k時的期望傷害*這種情況發生的概率,p[x][i][j][k]表示這種情況發生的概率

都能過

香港記者:

#include<iostream>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<bitset>
#include<set>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 51
#define MAXM 10
#define ll long long
#define eps 1e-8
#define MOD 1000000007
#define INF 1000000000
double f[MAXN][MAXM][MAXM][MAXM],p[MAXN][MAXM][MAXM][MAXM];
int n,A,B,C;
int main(){
	int i,j,k,l;
	int tmp;
	scanf("%d",&tmp);
	while(tmp--){
		scanf("%d%d%d%d",&n,&A,&B,&C);
		for(i=0;i<=n;i++){
			for(j=0;j<=7;j++){
				for(k=0;k<=7;k++){
					for(l=0;l<=7;l++){
						p[i][j][k][l]=0;
						f[i][j][k][l]=0;
					}
				}
			}
		}
		p[0][A][B][C]=1;
		for(i=0;i<n;i++){
			for(j=0;j<=7;j++){
				for(k=0;k<=7;k++){
					for(l=0;l<=7;l++){
						if(j+k+l<=7){
							p[i+1][j][k][l]+=p[i][j][k][l]*1/(j+k+l+1);
							f[i+1][j][k][l]+=(f[i][j][k][l]+p[i][j][k][l])*1/(j+k+l+1);
							if(j){
								p[i+1][j-1][k][l]+=p[i][j][k][l]*j/(j+k+l+1);
								f[i+1][j-1][k][l]+=f[i][j][k][l]*j/(j+k+l+1);
							}
							if(j+k+l==7){
								if(k){
									p[i+1][j+1][k-1][l]+=p[i][j][k][l]*k/(j+k+l+1);
									f[i+1][j+1][k-1][l]+=f[i][j][k][l]*k/(j+k+l+1);
								}
								if(l){
									p[i+1][j][k+1][l-1]+=p[i][j][k][l]*l/(j+k+l+1);
									f[i+1][j][k+1][l-1]+=f[i][j][k][l]*l/(j+k+l+1);
								}
							}else{
								if(k){
									p[i+1][j+1][k-1][l+1]+=p[i][j][k][l]*k/(j+k+l+1);
									f[i+1][j+1][k-1][l+1]+=f[i][j][k][l]*k/(j+k+l+1);
								}
								if(l){
									p[i+1][j][k+1][l]+=p[i][j][k][l]*l/(j+k+l+1);
									f[i+1][j][k+1][l]+=f[i][j][k][l]*l/(j+k+l+1);
								}
							}
						}
					}
				}
			}
		}
		double ans=0;
		for(i=0;i<=7;i++){
			for(j=0;j<=7;j++){
				for(k=0;k<=7;k++){
					ans+=f[n][i][j][k];
				}
			}
		}
		printf("%.2lf\n",ans);
	}
	return 0;
}

/*

*/

naive:

#include<iostream>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstdlib>
#include<cstdio>
#include<map>
#include<bitset>
#include<set>
#include<stack>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 51
#define MAXM 10
#define ll long long
#define eps 1e-8
#define MOD 1000000007
#define INF 1000000000
double f[MAXN][MAXN][MAXM][MAXM][MAXM],p[MAXN][MAXN][MAXM][MAXM][MAXM];
int n,A,B,C;
int main(){
	int i,j,k,x,y;
	int tmp;
	scanf("%d",&tmp);
	while(tmp--){
		scanf("%d%d%d%d",&n,&A,&B,&C);
		for(x=0;x<=n;x++){
			for(y=0;y<=n;y++){
				for(i=0;i<=7;i++){
					for(j=0;i+j<=7;j++){
						for(k=0;i+j+k<=7;k++){
							p[x][y][i][j][k]=0;
						}
					}
				}
			}
		}
		p[0][0][A][B][C]=1;
		for(x=0;x<n;x++){
			for(y=0;y<=x;y++){
				for(i=0;i<=7;i++){
					for(j=0;i+j<=7;j++){
						for(k=0;i+j+k<=7;k++){
							p[x+1][y+1][i][j][k]+=p[x][y][i][j][k]*1/(i+j+k+1);
							p[x+1][y][i-1][j][k]+=p[x][y][i][j][k]*i/(i+j+k+1);
							if(i+j+k==7){
								p[x+1][y][i+1][j-1][k]+=p[x][y][i][j][k]*j/(i+j+k+1);
								p[x+1][y][i][j+1][k-1]+=p[x][y][i][j][k]*k/(i+j+k+1);
							}else{
								p[x+1][y][i+1][j-1][k+1]+=p[x][y][i][j][k]*j/(i+j+k+1);
								p[x+1][y][i][j+1][k]+=p[x][y][i][j][k]*k/(i+j+k+1);
							}
						}
					}
				}
			}
		}
		double ans=0;
		for(x=0;x<=n;x++){
			for(i=0;i<=7;i++){
				for(j=0;j<=7;j++){
					for(k=0;k<=7;k++){
						ans+=x*p[n][x][i][j][k];
					}
				}
			}
		}
		printf("%.2lf\n",ans);
	}
	return 0;
}

/*

*/



發佈了404 篇原創文章 · 獲贊 120 · 訪問量 32萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章