题目地址:http://acm.qust.edu.cn/problem.php?id=1782
题目描述
输入
N <= 10000 , M <= 500 , D_i <= 1000
输出
样例输入
样例输出
解题思路
代码
#include<cstdio>
#include<iostream>
using namespace std;
int f[10010][510],a[10010];//第i秒疲劳值为j时走的最大路程。
int main()
{
int n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
for(i=1;i<=n;++i)
{
//选择跑
for(j=0; j<=m&&j<=i; ++j)//j<=i疲劳值不可能超过一直跑所获得的疲劳,最长不下降子序列也是要在当前位置之前去找最大
{
f[i][j]=max(f[i][j],f[i-1][j-1]+a[i]);
//上面这句话是循环找上一秒各个不同疲劳时的最大值,类比于最长不下降子序列,就是找之前比他数值小的中最长的一个
//实际上等于
//if(f[i][j]<f[i-1][j-1]+a[i])
//f[i][j]=f[i-1][j-1]+a[i];
}
f[i][0]=f[i-1][0];//第i秒疲劳值为零有两种情况,一是一直在休息
// 二是第i-k秒休息了k秒后疲劳值到0了,然后不休息了
int k;//k表示休息了几秒
for(k=1;k<=m&&k<=i;++k)//第i秒的时候不可能休息超过了i秒
{
f[i][0]=max(f[i][0],f[i-k][k]);
}
}
printf("%d",f[n][0]);
return 0;
}
241




被折叠的 条评论
为什么被折叠?



