码迷,mamicode.com
首页 > 其他好文 > 详细

Dp Milking Time POJ - 3616

时间:2017-08-13 20:02:27      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:技术   scan   自己   表示   ring   休息   fine   class   ++   

题目大意: 一头奶牛产奶的时间是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

标签:技术   scan   自己   表示   ring   休息   fine   class   ++   

原文地址:http://www.cnblogs.com/Twsc/p/7354394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!