NKOJ2915 出租 [DP]
问题描述
明年1月到7月何老板将去环球旅行,在这期间,他打算把他在重庆的两套完全一样的房子租出去。现在有5个人想要租何老板的房子,他们的租期和愿意出的租金如下图所示:
租房者 租期(从第x月租到第y月) 愿意出的租金
甲 1月到2月 10
乙 4月到7月 20
丙 1月到3月 2
丁 3月到7月 3
茂 1月到6月 4
何老板想得到尽可能多的租金,他该把房子租给哪些人呢?
输入格式
第1行:两个正整数,t表示何老板的房子从1月到t月可供出租,n表示租房者的人数
接下来n行:每行三个正整数t1,t2,w, 分别表示第i个租房者的开始时间、结束时间和愿意出的租金隔。
输出格式
只有1行: 1个整数,表示能得到的最大租金。
解法
f[i][j]表示第一套房子出租前i个月,第二套房子出租前j个月的最大收益
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#define N 510
using namespace std;
struct node{int s,e,w;}A[N];
bool cmp(node a,node b){return a.s<b.s;}
int f[N][N];
int main(){
int t,n;scanf("%d%d",&t,&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&A[i].s,&A[i].e,&A[i].w);
sort(A+1,A+n+1,cmp);
for(int i=1;i<=n;i++)
for(int a=t;a;a--)
for(int b=t;b;b--){
if(a>=A[i].e)f[a][b]=max(f[a][b],f[A[i].s-1][b]+A[i].w);
if(b>=A[i].e)f[a][b]=max(f[a][b],f[a][A[i].s-1]+A[i].w);
}
printf("%d",f[t][t]);return 0;
}