恶意竞争题解

恶意竞争

题目大意:

巨软和微硬两家公司是竞争对手,微硬希望从巨软公司的软件中找到漏洞来打击竞品的销量。巨软公司的软件有\(s\)个子组件,漏洞分为\(n\)类,微硬公司希望在其中每个子组件中都找到至少一个漏洞,且找到每个类型至少一个漏洞。微硬公司每天可以找到一个漏洞(从每个子组件中找出漏洞的概率相同,漏洞属于任一分类的概率相同。假设漏洞足够多,找出任意漏洞不影响前述条件),请你帮他们求出完成目标的期望天数。

分析:

这是一道比较经典的期望dp题,我们令dp[i][j]为当前已经有了i个漏洞,j个子组件时找完剩下的期望天数,这样我们的dp[n][s] = 0,而我们的目标答案就是dp[0][0],而这里还要注意一点就是,列出来的状态转移会存在"自己推自己的情况"所以我们还需要进行一个移项。

#include<bits/stdc++.h>
using namespace std;
double dp[1005][1005];

int main(){
	int n, s;
	cin >> n >> s;
	dp[n][s] = 0;
	for (int i = n; i >= 1; --i){
		for (int j = s; j >= 1; --j){
			if (j == s && i == n) continue;
			double p = n * s - i * j;
			dp[i][j] = (n * s ) / p + (i * (s - j)) / p * dp[i][j + 1] + ((n - i) * j) / p * dp[i + 1][j] + ((n - i) * (s - j)) / p * dp[i + 1][j + 1];
		}
	}
	cout << dp[0][0];
}
posted @ 2022-12-30 14:22  zkhcwy  阅读(55)  评论(0编辑  收藏  举报