for (int k = i; k < j; k++) {
if (op[k] == 't') {
dp[i][j][0] = max(dp[i][j][0], dp[i][k][0] + dp[k + 1][j][0]);
dp[i][j][1] = min(dp[i][j][1], dp[i][k][1] + dp[k + 1][j][1]);
} else {
dp[i][j][0] = max(dp[i][j][0], max(dp[i][k][1] * dp[k + 1][j][1], dp[i][k][0] * dp[k + 1][j][0]));
dp[i][j][1] = min(dp[i][j][1], min(dp[i][k][1] * dp[k + 1][j][1], min(dp[i][k][0] * dp[k + 1][j][0], min(dp[i][k][1] * dp[k + 1][j][0], dp[i][k][0] * dp[k + 1][j][1]))));
}
}
for (int k = i + 1; k <= j; k++) {
if (op[k] == 't') {
dp[i][j][0] = max(dp[i][j][0], dp[i][k - 1][0] + dp[k][j][0]);
dp[i][j][1] = min(dp[i][j][1], dp[i][k - 1][1] + dp[k][j][1]);
} else {
dp[i][j][0] = max(dp[i][j][0], max(dp[i][k - 1][1] * dp[k][j][1], dp[i][k - 1][0] * dp[k][j][0]));
dp[i][j][1] = min(dp[i][j][1], min(dp[i][k - 1][1] * dp[k][j][1], min(dp[i][k - 1][0] * dp[k][j][0], min(dp[i][k - 1][1] * dp[k][j][0], dp[i][k - 1][0] * dp[k][j][1]))));
}
}
第一个里两个子区间是 [i,k] 和 [k+1,j],k∈[i,j)。第二个里两个子区间是 [i,k−1] 和 [k,j],k∈(i,j]。为什么第一个会 WA 第二个能 AC。/yiw