1. 程式人生 > >Dp Milking Time POJ - 3616

Dp Milking Time POJ - 3616

mat bsp urn 時間 clas ios ostream src ++

題目大意: 一頭奶牛產奶的時間是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