社区讨论
WA84pts可参考检查方向
P1850[NOIP 2016 提高组] 换教室参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @m6cbnc3c
- 此快照首次捕获于
- 2025/01/25 23:04 去年
- 此快照最后确认于
- 2025/11/04 10:39 4 个月前
如果检查发现自己递推式写得没问题,
然后检查了各个部分的精度都没有出现误差,
可以注意下自己初始化的问题。
一定要在开始递推之前把dp数组初始化为inf。
CPP//正确初始化顺序
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])) );
}
CPP//错误示范,但其实我也不知道为啥不行,改成先初始化再推就对了…
//我猜测可能是像下面这样初始化有部分遗漏,非常欢迎各位大佬指教
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;
}
……
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...