动归的主要思想还是通过解决子问题一步一步解决最终的问题,就像是大BOSS问他的助理一个问题,然后助理又问下一层,然后一层一层的往下,但其实最底层的人很笨,说的很啰嗦,且不完善,所以就需要每上一层的完善,直到得到最好的答案告诉大BOSS。
通过这道题,发现动归关键要找到存储每层最佳答案的标准,即容器,还有就是递推公式,比如这道题的递推公式我就没推明白,最后只能半知半解的抄袭了这道题的题解,例如我就不是很明白为什么只要休息就休息到疲惫值为零就是最佳状态,这种idea简直突破我的脑洞。。。。
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define M 10005
using namespace std;
int s[M];
int f[M][505] = {0};
int main()
{
int n,m;
int i, j, k, b;
scanf("%d%d", &n, &m);
for(i = 1; i<= n; i++)
{
scanf("%d", &s[i]);
}
f[1][1] = s[1];
int ma = 0;
for(i = 2; i<= n; i++)
{
for(j = 0; j<= m; j++)
{
if(j ==0)
{
for(k = 1; k<=i>>1; k++)
{
ma = max(ma,f[i-k][k]);
}
ma =max(ma, f[i-1][j]);
f[i][j] = ma;
ma =0;
}
else
f[i][j]= f[i-1][j-1]+s[i];
}
}
printf("%d", f[n][0]);
return 0;
}