dp——[Usaco2007 Nov]Milking Time

解题的思想用到了 类似最长递增子序的方法,先按起始时间升序排序,不断更新,到某点(包括改点)最大值
排序的目的:可以把看似二维的区间降到一维!!!!
O(n*n)
dp[i]=max(dp[i],dp[j]+node[i].v);
dp[i]放着的是包括i点,最大的价值
View Code
#include<stdio.h>
#include
<iostream>
#include
<algorithm>
#include
<string.h>
using namespace std;

struct data
{
int b,e;
int v;
}node[
1009];

int dp[1009];

bool cmp(data a,data b)
{
if(a.b==b.b)
return a.e<b.e;
else
return a.b<b.b;
}


int main()
{
int n,time;
while(scanf("%*d%d%d",&n,&time)!=EOF)
{
int i,j;
memset(dp,
0,sizeof(dp));
for(i=0;i<n;i++)
{
scanf(
"%d%d%d",&node[i].b,&node[i].e,&node[i].v);
node[i].e
+=time;

}
sort(
&node[0],&node[n],cmp);
for(i=0;i<n;i++)
{
dp[i]
=node[i].v;
}

for(i=1;i<n;i++)
{
for(j=0;j<i;j++)
{
if(node[i].b>=node[j].e)
{
if(dp[i]<dp[j]+node[i].v)
{
dp[i]
=dp[j]+node[i].v;
}
}
}
}

int max=0;
for(i=0;i<n;i++)
{
if(max<dp[i])max=dp[i];
}

printf(
"%d\n",max);
}
}

  

原文地址:https://www.cnblogs.com/huhuuu/p/2117924.html