看了好久才觉得是dp…
用dp[i][j]来代表第i秒剩余j能量能走的最大距离。但直接这么设开数组时会MLE,所以得进行空间优化。
另外本题要运用滚动数组法优化,但由于dp[i][j]和dp[i - 1][j]的左右两边都有关系,所以我们不能直接省略掉一维,而是只保留最后两秒的状态,交上去直接就过了。。。
#include <bits/stdc++.h>
using namespace std;
int dp[2][1005];//dp[i][j]表示时间为i,能量为j能跑的最大路程。
int main()
{
int m, s, t, f = 0;
cin >> m >> s >> t;
for(int i = 1; i <= t; i++)
{
for(int j = 0; j <= m; j++)
{
dp[0][j] = dp[1][j];
}
for(int j = 0; j <= m; j++)
{
dp[1][j] = max(j >= 4? dp[0][j - 4] : 0, max(dp[0][j] + 17, j + 10 <= m ? dp[0][j + 10] + 60 : 0));
if(dp[1][j] >= s)
{
printf("Yes\n%d\n",i);
f = 1;
break;
}
}
if(f) break;
}
if(!f)
{
int ans = 0;
for(int j = 0; j <= m; j++) ans = max(ans, dp[1][j]);
printf("No\n%d\n", ans);
}
return 0;
}
当然原题下面还有借助贪心思想优化的题解。。不过当时没想出来。。。