P2111 考场奇遇 ( 期望dp

#include 
using namespace std;
using VI = vector;
double dp[2000010];

int n,q;
double a;
string s;
//1 表示答案一样 0表示答案不一样
//答案一样时 正确的概率为 a   不一样时正确的概率为 1 - a
//第 i 个题目时,至少对j个题目的的概率
//dp[i][j] = dp[i-1][j] + a * dp[i][j-1]
int main(){
    cin>>n>>a>>q;
    cin>>s;
    s = " " + s;
    a /= 100;
    dp[0] = 1;
    for(int i = 1 ; i <= n ; i++){
        double t ;
        if(s[i] == '1') t = a;
        else t = (1 - a);
        for(int j = i; j >= 1 ; j--){
            dp[j] = (1 - t) * dp[j] + dp[j-1] * t;    
        }
        dp[0] = dp[0] * (1-t);
    }
    double res = 0 ;
    for(int i = q; i <= n;i++){
        //cout<

其实感觉像个背包,

dp[i][j] 表示第i个题目做对了j题的 dp[i][j] = t * dp[i-1][j-1]  + (1-t) * dp[i-1][j]

可以像背包一样省掉一维

你可能感兴趣的:(dp,算法,数据结构,图论)