标签:技术 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; }
最长递增子序列
#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; }
标签:技术 scan 自己 表示 ring 休息 fine class ++
原文地址:http://www.cnblogs.com/Twsc/p/7354394.html