WA84pts可参考检查方向
查看原帖
WA84pts可参考检查方向
53639
xuan_ling楼主2025/1/25 23:02

如果检查发现自己递推式写得没问题,

然后检查了各个部分的精度都没有出现误差,

可以注意下自己初始化的问题。

一定要在开始递推之前把dp数组初始化为inf。

//正确初始化顺序
    for (int i = 0; i <= n; i++)
        for (int j = 0; j <= m; j++)dp[i][j][0] = dp[i][j][1] = inf;

    dp[1][0][0] = 0 , dp[1][1][1] = 0;
    for(int i = 2 ; i <= n ; i++)
        for(int j = 0 ;j <= min(i , m) ; j++)
        {
            if(j == 0){
                dp[i][0][0] = dp[i - 1][0][0] + (double)mp[class1[i - 1]][class1[i]];
                continue;
            }
            dp[i][j][0] = min(dp[i-1][j][0] + (double)mp[class1[i-1]][class1[i]] , dp[i - 1][j][1] + pro[i-1] * ((double)mp[class2[i - 1]][class1[i]]) + (double)(1-pro[i-1]) * ((double)mp[class1[i - 1]][class1[i]]));
            dp[i][j][1] = min(dp[i-1][j-1][0] + (double)mp[class1[i-1]][class2[i]] * pro[i] + (double)mp[class1[i-1]][class1[i]] * (double)(1 - pro[i]) ,
                               dp[i-1][j-1][1] + pro[i-1] * ((double)mp[class2[i-1]][class2[i]] * pro[i] + (double)mp[class2[i-1]][class1[i]] * (double)(1 - pro[i])) + 
                               (double)(1 - pro[i-1]) * ((double)mp[class1[i-1]][class2[i]] * pro[i] + (double)mp[class1[i-1]][class1[i]] * (1 - pro[i])) );         
        }
//错误示范,但其实我也不知道为啥不行,改成先初始化再推就对了…
//我猜测可能是像下面这样初始化有部分遗漏,非常欢迎各位大佬指教

dp[1][0][0] = 0 , dp[1][1][1] = 0 , dp[1][0][1] = inf , dp[1][1][0] = inf;
    for(int i = 2 ; i <= n ; i++)
        for(int j = 0 ;j <= min(i , m) ; j++)
        {
            if(j == 0){
                dp[i][0][0] = dp[i - 1][0][0] + (double)mp[class1[i - 1]][class1[i]];
                dp[i][1][0] = inf;
                continue;
            }
     ……
}
2025/1/25 23:02
加载中...