如果检查发现自己递推式写得没问题,
然后检查了各个部分的精度都没有出现误差,
可以注意下自己初始化的问题。
一定要在开始递推之前把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;
}
……
}