Dp Milking Time POJ - 3616
阿新 • • 發佈:2017-08-13
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 namespaceView Codestd; 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; }
最長遞增子序列
#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