恶意竞争题解
恶意竞争
题目大意:
巨软和微硬两家公司是竞争对手,微硬希望从巨软公司的软件中找到漏洞来打击竞品的销量。巨软公司的软件有\(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];
}