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

 

發佈了221 篇原創文章 · 獲贊 10 · 訪問量 9477
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章