题解:
直接把额外需要的休息时间加到结束时间上,然后按照开始时间排个序,用类似于LIS的套路求出最大牛奶量就行了。
状态:dp[i]表示从1到i的最大牛奶量
状态转移:dp[i]=dp[j]+第i个的牛奶量(1<=j<=i-1&&j的结束时间小于等于i的开始时间)
#pragma GCC optimize(2) #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<cstdio> #include<cstdlib> #include<vector> #include<map> #include<set> #include<stack> #include<queue> #define PI atan(1.0)*4 #define E 2.718281828 #define rp(i,s,t) for (register int i = (s); i <= (t); i++) #define RP(i,t,s) for (register int i = (t); i >= (s); i--) #define ll long long #define ull unsigned long long #define mst(a,b) memset(a,b,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> #define pb push_back #define debug printf("ac\n"); using namespace std; inline int read() { int a=0,b=1; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') b=-1; c=getchar(); } while(c>='0'&&c<='9') { a=(a<<3)+(a<<1)+c-'0'; c=getchar(); } return a*b; } const int INF = 0x3f3f3f3f; const int N = 1e3+7; struct node{ int st,ed,ef; bool operator <(const node& a){ return st<a.st; } }p[N]; int dp[N]; int main(){ int n=read(),m=read(),r=read(); rp(i,1,m) p[i].st=read(),p[i].ed=read(),p[i].ef=read(),p[i].ed+=r; sort(p+1,p+1+m); rp(i,1,m){ dp[i]=p[i].ef; rp(j,1,i-1) if(p[j].ed<=p[i].st) dp[i]=max(dp[i],dp[j]+p[i].ef); } printf("%d\n",*max_element(dp+1,dp+1+m)); return 0; } /* 7 1 3 2 4 5 3 9 */
dp训练计划——poj3616LIS变形
最新推荐文章于 2024-08-17 03:38:43 发布