1. 程式人生 > >openjudge 6045:開餐館

openjudge 6045:開餐館

現在 直線 最大利潤 += ++ bsp 避免 sizeof 最大收益

描述

北大信息學院的同學小明畢業之後打算創業開餐館.現在共有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
鏈接:http://noi.openjudge.cn/ch0206/6045/
設F[i]表示在第i個位置開餐館的最大收益
F[i]=p[i]+max(F[j])a[i]-a[j]>k
#include<cstdio>
#include<cstring>
const int N=105;
int m[N],p[N],f[N];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k,mx=0
; scanf("%d%d",&n,&k); for(int i=1;i<=n;++i) scanf("%d",&m[i]); for(int i=1;i<=n;++i) scanf("%d",&p[i]); memset(f,0,sizeof(f)); for(int i=1;i<=n;++i) { for(int j=1;j<i&&m[i]-m[j]>k;++j)
if(f[j]>f[i]) f[i]=f[j]; f[i]+=p[i]; if(f[i]>mx) mx=f[i]; } printf("%d\n",mx); } return 0; }

openjudge 6045:開餐館