【题解】 P1850 [NOIP2016 提高组] 换教室(又是一道debug的DP,debug经验++)

题目地址

坑点一:

dis[u][v] = w; => dis[u][v] = min(dis[u][v], w);

坑点二:

注意到有意义的状态是从f[i][0][0]=>f[i][min(m, i)][0/1],f[i][i][0/1]是有意义的,尤其是f[1][1][1]是 有 意 义 的 ! j=0时f[i][0][1]是没有意义的;初始化:f[0][0/1][0/1]=0;

在我测试的两个数据中,一组的最优解是第一节课先去c[1],所以不用f[1][1][1]并没有用;但是另一组是先去d[1],所以必须转移到f[1][1][1];

但是这样第一组数据就有问题了

warning三:

dis[0][c[1]/d[1]]=0,用于f[0->1]的转移;

tips四:

静态差错:14->64
重构代码:64->84
整理状态意义:84->96

还有,这题是花三年前A掉的,也就是是说现在高一的我还不如初三的花。

挂一个94分+偷点的代码: