奥利安娜的球有五档攻击。每一档在每一次攻击的时候造成的伤害都不一样。有一个条件,就是如果奥利安娜这次的攻击档数比上一次低,那么下一次攻击就要比这次高,相反如果奥利安娜这次的档数比上一次高,那么下一次攻击就要比这次低。 给出每个档在每次攻击所能造成的伤害,问最大能造成多少伤害。 这题的`DP`感觉还算明显的,我们设有如下的状态: dp[i][j][k] 设上式的意思为第`i`次攻击的时候选`j`档,然后最后的`k`只有`0`和`1`,代表这次攻击比上次攻击的档数是高还是低。 那么就有如下的转移方程: for(int i = 2; i < n; i++) { for(int j = 0; j < 5; j++) { for(int k = 0; k < 5; k++) { if(j == k) continue; if(j < k) dp[i][j][0] = max(dp[i][j][0], dp[i - 1][k][1] + M[j][i]); else if(j > k) dp[i][j][1] = max(dp[i][j][1], dp[i - 1][k][0] + M[j][i]); } } } 最后我们只需要选择最后一次攻击的时候的几个答案中最大的那个即可。