题目大意:
题目是说,一个农民要给奶牛挤奶,为了得到最大化的产奶量。给定一天的n个小时,然后m个时间段可以挤奶,每次完成挤奶后,奶牛会休息r小时,每段时间挤奶的
效率为efficiency_i。求出最大的挤奶量。
解题思路:
这道题,想想贪心应该可以过,对于所有的坐标,找出最先结束的点,然后在不满足重叠的情况下,去计算最大的奶量,但是,这就是有的时候贪心和dp的矛盾所在了,
因为我在寻找最先结束的一个挤奶阶段,然后再用同样的方法去寻找下一个这样的阶段,会导致n个这样的阶段的和小于某次的值,所以这个贪心算法不能够完成问题的最优解了。
然后就想到用dp,定义状态dp[i]表示前i个阶段所得到的最大奶量。
状态转移方程:dp[i] = dp[i-1]+a[j].efficiency;
好了,有了这样的方程,就像求解其他dp问题一样,最后输出最大的就OK了。
代码:
# include<cstdio>
# include<iostream>
# include<algorithm>
# include<cstring>
# include<string>
# include<cmath>
# include<queue>
# include<stack>
# include<set>
# include<map>
using namespace std;
# define inf 999999999
# define MAX 1000+4
int dp[MAX];
int n,m,r;
struct node
{
int sta;
int en;
int eff;
}a[MAX];
int cmp ( const node & x,const node & y )
{
return x.sta < y.sta;
}
int main(void)
{
while ( cin>>n>>m>>r )
{
for ( int i = 0;i < m;i++ )
{
cin>>a[i].sta>>a[i].en>>a[i].eff;
a[i].en += r;
}
sort(a,a+m,cmp);
for ( int i = 0;i < m;i++ )
dp[i] = a[i].eff;
for ( int i = 0;i < m;i++ )
{
for ( int j = 0;j < i;j++ )
{
if ( a[j].en <= a[i].sta )
{
dp[i] = max(dp[i],dp[j]+a[i].eff);
}
}
}
int ans = 0;
for ( int i = 0;i < m;i++ )
{
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
}
return 0;
}