NKOJ2915 出租 [DP]

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;
}

猜你喜欢

转载自blog.csdn.net/arliastark/article/details/80719968