可以帮忙解决这个概率dp吗

骑猪大侠 2019-09-23 08:04:49
链接:https://ac.nowcoder.com/acm/problem/21626
来源:牛客网

牛牛 和 牛妹 正在玩一个游戏

牛牛扔了a个b面的骰子

牛妹扔了c个d面的骰子

对于一个x面的骰子,每个面依次会写有1到x的数

一个玩家的得分就是每个骰子朝上的面的数字的总和,一个玩家能赢另一个玩家当且仅当得分严格大于另一个玩家,给你a,b,c,d,如果牛牛不可能赢,输出-1

否则假设你知道了牛牛赢了,但是不知道牛牛和牛妹的具体分数,返回牛牛的期望得分

input:输入一行,包含4个整数a,b,c,d (1 ≤ a,b,c,d ≤ 50)

output:输出一个浮点数,误差在1e-3以内

样例1: 1 2 1 5
输出 2.0
样例2: 3 1 1 3
输出 3.0
具体的可以进上面的网站
...全文
78 点赞 收藏 14
写回复
14 条回复
骑猪大侠 2019年09月25日
引用 13 楼 你可以永远相信他 的回复:
[quote=引用 12 楼 Italink 的回复:] [quote=引用 10 楼 你可以永远相信他的回复:][quote=引用 9 楼 Italink 的回复:] 写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以说说你的思路吗,你的好像是对的,只是题目必
引用 1 楼 Italink 的回复:
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以讲讲你的思路吗.我运行了一下,前面的数据都过了,就是后面数据范围都扩大后,内存超限了[/quote] 不好意思,今天才看到,因为50的50次方已经很大了,所以才会超限,我是通过排列组合,得到2个数组,分别是两人的得分所有情况,然后通过两种for,对比得到牛牛胜利的情况,最后计算期望[/quote]我已经根据你的思路写出来了,[/quote]我用的dp做的,把牛牛能赢的情况的总分算出来,再除牛牛能赢的总情况有多少种就可以了
回复 点赞
骑猪大侠 2019年09月25日
引用 12 楼 Italink 的回复:
[quote=引用 10 楼 你可以永远相信他的回复:][quote=引用 9 楼 Italink 的回复:] 写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以说说你的思路吗,你的好像是对的,只是题目必
引用 1 楼 Italink 的回复:
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以讲讲你的思路吗.我运行了一下,前面的数据都过了,就是后面数据范围都扩大后,内存超限了[/quote] 不好意思,今天才看到,因为50的50次方已经很大了,所以才会超限,我是通过排列组合,得到2个数组,分别是两人的得分所有情况,然后通过两种for,对比得到牛牛胜利的情况,最后计算期望[/quote]我已经根据你的思路写出来了,
回复 点赞
Italink 2019年09月25日
引用 10 楼 你可以永远相信他的回复:
[quote=引用 9 楼 Italink 的回复:] 写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以说说你的思路吗,你的好像是对的,只是题目必
引用 1 楼 Italink 的回复:
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以讲讲你的思路吗.我运行了一下,前面的数据都过了,就是后面数据范围都扩大后,内存超限了[/quote] 不好意思,今天才看到,因为50的50次方已经很大了,所以才会超限,我是通过排列组合,得到2个数组,分别是两人的得分所有情况,然后通过两种for,对比得到牛牛胜利的情况,最后计算期望
回复 点赞
骑猪大侠 2019年09月25日
引用 9 楼 Italink 的回复:
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
大佬思路是正确的
回复 点赞
骑猪大侠 2019年09月24日
引用 9 楼 Italink 的回复:
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以说说你的思路吗,你的好像是对的,只是题目必
引用 1 楼 Italink 的回复:
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路

#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
	vector<int> vc(n);
	for (int i = 0; i < n; i++)
		vc[i] = i + 1;
	return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
	for (int i = 1; i < num; ++i) {
		vector<int> t(vc.size() * side);
		for (int j = 0; j < vc.size(); ++j) 
			for (int k = 0; k < side; ++k) 
				t[j * side + k] = vc[j] + k + 1;
		vc = t;
	}
	return vc;
}
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	vector<int> boy = creat(b), girl = creat(d);
	pair<int, int> result{0,0};
	auto k = getAllPossible(boy, a, b);
	for (int& i : getAllPossible(boy, a, b)) {
		for (int& j : getAllPossible(girl, c, d)) {
			if (i > j) {
				result.first+=i;
				++result.second;
			}
		}
	}
	printf("%lf", result.first / (double)result.second);
	return 0;
}
可以讲讲你的思路吗.我运行了一下,前面的数据都过了,就是后面数据范围都扩大后,内存超限了
回复 点赞
Italink 2019年09月23日
写了一个没格式化输出,且只能通过小数据的代码,看能不能提供一点什么思路


#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<int> creat(const int& n) {
vector<int> vc(n);
for (int i = 0; i < n; i++)
vc[i] = i + 1;
return vc;
}
vector<int> getAllPossible(vector<int> vc,const int& num, const int &side) {
for (int i = 1; i < num; ++i) {
vector<int> t(vc.size() * side);
for (int j = 0; j < vc.size(); ++j)
for (int k = 0; k < side; ++k)
t[j * side + k] = vc[j] + k + 1;
vc = t;
}
return vc;
}
int main() {
int a, b, c, d;
cin >> a >> b >> c >> d;
vector<int> boy = creat(b), girl = creat(d);
pair<int, int> result{0,0};
auto k = getAllPossible(boy, a, b);
for (int& i : getAllPossible(boy, a, b)) {
for (int& j : getAllPossible(girl, c, d)) {
if (i > j) {
result.first+=i;
++result.second;
}
}
}
printf("%lf", result.first / (double)result.second);
return 0;
}
回复 点赞
wowpH 2019年09月23日
引用 7 楼 你可以永远相信他 的回复:
引用 6 楼 wowpH 的回复:
引用 5 楼 wowpH 的回复:
那什么是期望分啊,我晕了。
刚注册了账号,看了全题。。。他有5组数据,你就贴了2组。。。还是最没用的两组。。。我现在懂期望的意思了。
好难,不会做。。。
回复 点赞
骑猪大侠 2019年09月23日
引用 6 楼 wowpH 的回复:
引用 5 楼 wowpH 的回复:
那什么是期望分啊,我晕了。
刚注册了账号,看了全题。。。他有5组数据,你就贴了2组。。。还是最没用的两组。。。我现在懂期望的意思了。
回复 点赞
wowpH 2019年09月23日
引用 5 楼 wowpH 的回复:
那什么是期望分啊,我晕了。
刚注册了账号,看了全题。。。他有5组数据,你就贴了2组。。。还是最没用的两组。。。我现在懂期望的意思了。
回复 点赞
wowpH 2019年09月23日
引用 4 楼 你可以永远相信他 的回复:
题目想让你求得分的期望
那什么是期望分啊,我晕了。
回复 点赞
骑猪大侠 2019年09月23日
引用 3 楼 wowpH 的回复:
[quote=引用 2 楼 你可以永远相信他 的回复:] [quote=引用 1 楼 wowpH 的回复:] 牛牛的最大值和牛妹的最小值比较就行了吧。 还是我理解有误?
还要算期望得分啊emm[/quote]期望分难道不是越大越好?谁不期望自己得分高。而且从这两组数据来看,2.0 和 3.0 是最高分。[/quote]题目想让你求得分的期望
回复 点赞
wowpH 2019年09月23日
引用 2 楼 你可以永远相信他 的回复:
[quote=引用 1 楼 wowpH 的回复:] 牛牛的最大值和牛妹的最小值比较就行了吧。 还是我理解有误?
还要算期望得分啊emm[/quote]期望分难道不是越大越好?谁不期望自己得分高。而且从这两组数据来看,2.0 和 3.0 是最高分。
回复 点赞
骑猪大侠 2019年09月23日
引用 1 楼 wowpH 的回复:
牛牛的最大值和牛妹的最小值比较就行了吧。 还是我理解有误?
还要算期望得分啊emm
回复 点赞
wowpH 2019年09月23日
牛牛的最大值和牛妹的最小值比较就行了吧。 还是我理解有误?
回复 点赞
发动态
发帖子
C++ 语言
创建于2007-09-28

3.1w+

社区成员

24.8w+

社区内容

C++ 语言相关问题讨论,技术干货分享
社区公告
暂无公告