需要暴力清空。
如果你的清空方法如下:
for(int i=1;i<=n;i++) for(int l=0;l<=k;l++)
dp[i][0][l]=dp[i][i+1][l]=-1e16;
这其实并不正确。
因为在下面:
for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) for(int l=0;l<=k&&l<=i;l++) {
dp[i][j][l]=max(dp[i-1][j][l],dp[i-1][j-1][l])+mp[i][j];
if(l>0) dp[i][j][l]=max(dp[i][j][l],max(dp[i-1][j][l-1]+mp[i][j]*3,dp[i-1][j-1][l-1]+mp[i][j]*3));
}
注意到当 l 取最大值的时候,
一定会从 dpi−1,j,l 转移。
显然如果用上述清空方法会导致答案错误。