1296:开餐馆

【题目描述】

信息学院的同学小明毕业之后打算创业开餐馆.现在共有n

个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 n个地点排列在同一条直线上。我们用一个整数序列m1,m2,...mn来表示他们的相对位置。由于地段关系,开餐馆的利润会有所不同。我们用pi 表示在mi处开餐馆的利润。为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于k

。请你帮助小明选择一个总利润最大的方案。

【输入】

输入第一行是整数 T(1≤T≤1000)

,表明有T组测试数据。紧接着有T组连续的测试。每组测试数据有3

行。

第1行:地点总数n(n<100)

, 距离限制k(k>0且k<1000)

第2行:n 个地点的位置m1,m2,...mn(1000000>mi>0

且为整数,升序排列);

第3行:n 个地点的餐馆利润p1,p2,...pn(1000>pi>0

且为整数)。

【输出】

对于每组测试数据可能的最大利润。

【输入样例】

2
3 11
1 2 15
10 2 30
3 16
1 2 15
10 2 30

【输出样例】

40
30

 状态方程:dp[i]=max(dp[i],dp[j]+profit[i])//dp[i]表示前i个地点开餐馆的最大利润

// Created on 2020/2/20

/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int idata=1000+5;
const int inf=0x3f3f3f3f;
int n,m,t;
int minn=INT_MAX,maxx=INT_MIN;
ll sumfee[idata];
int maps[idata],profit[idata];
int seat[idata];
int i,v,j,k;

inline void initial()
{
    for(i=1;i<=n;i++)
        cin>>maps[i];

    for(i=1;i<=n;i++)
    {
        cin>>profit[i];
        sumfee[i]=profit[i];
    }

    maxx=-inf;
    return ;
}

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        initial();

        for(i=2;i<=n;i++)
        {
            for(j=1;j<i;j++)
            {
                if(maps[i]-maps[j]>m)
                    sumfee[i]=max(sumfee[i],sumfee[j]+profit[i]);
            }
        }

        for(i=1;i<=n;i++)
        {
            if(maxx<sumfee[i])
                maxx=sumfee[i];
        }

        cout<<maxx<<endl;
    }
    return 0;
}

 

// Created on 2020/2/20

/*#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <climits>*/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int idata=1000+5;
const int inf=0x3f3f3f3f;
int n,m,t;
int minn=INT_MAX,maxx=INT_MIN;
ll sumfee[idata];
int maps[idata],profit[idata];
int i,v,j,k;

inline void initial()
{
    for(i=1;i<=n;i++)
        cin>>maps[i];

    for(i=1;i<=n;i++)
    {
        cin>>profit[i];
    }

    memset(sumfee,0,sizeof(sumfee));
    maxx=-inf;

    return ;
}

int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        initial();

        for(i=1;i<=n;i++)
        {
            for(j=1;j<i;j++)
            {
                if(maps[i]-maps[j]>m&&sumfee[j]>sumfee[i])
                    sumfee[i]=sumfee[j];
            }
            sumfee[i]+=profit[i];
        }

        for(i=1;i<=n;i++)
        {
            if(maxx<sumfee[i])
                maxx=sumfee[i];
        }

        cout<<maxx<<endl;
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值