首页 > 代码库 > Dp Milking Time POJ - 3616

Dp Milking Time POJ - 3616

题目大意: 一头奶牛产奶的时间是1-n,农夫有m个时间段可以去收集奶,每次收了奶之后奶牛要休息R时间,求农夫可以收的奶的最大值。

每次自己要想蛮久都想不出怎么去推,还是做的题太少啦。。。一看题解 知道dp[i]表示区间[1,i]所能得到牛奶的最大值后,一下就写出来啦。

思路类似于求最长递增子序列。

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1005
using namespace std;
typedef struct
{
    int x1,x2,c;
}P;
P a[maxn];
int dp[maxn];
int n,m,r;
int cmp(P c,P d)
{
    return c.x1<d.x1;
}
int main()
{
    scanf("%d%d%d",&n,&m,&r);
    for(int i=1;i<=m;i++)
      scanf("%d%d%d",&a[i].x1,&a[i].x2,&a[i].c);
    sort(a+1,a+1+m,cmp);
    dp[1]=a[1].c;
    int ans=dp[1];
    for(int i=2;i<=m;i++)
    {
        int ma=0;
        for(int j=1;j<i;j++)
            if(a[i].x1>=a[j].x2+r&&dp[j]>ma)
               ma=dp[j];
        dp[i]=ma+a[i].c;
        ans=max(ans,dp[i]);
    }
    printf("%d\n",ans);
    return 0;
}
View Code

最长递增子序列

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1005
using namespace std;
int a[maxn],dp[maxn];
int main()
{
    int n;
   while(~scanf("%d",&n))
   {

    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    {
        dp[i]=1;
        for(int j=1;j<i;j++)
          if(a[i]>a[j])
            dp[i]=max(dp[i],dp[j]+1);
    }
    printf("%d\n",*max_element(dp+1,dp+1+n));
   }
    return 0;
}
View Code

 

Dp Milking Time POJ - 3616