openjudge 开餐馆(dp)

问题分析

问在一条直线上的 n 个位置开餐馆可以获得的最大利润是多少,必须保证每个餐馆的距离大于 k
状态转移方程的话,我觉得和最长上升子序列蛮像的,这里是用 d p [ d ] 来代表以 d 位置结尾所获得的最大利润是多少
那么方程就是 d p [ d ] = m a x ( d p [ d ] , d p [ j ] + v [ d ] ) ( l o c [ d ] l o c [ j ] > k , 1 j < d n )

#include<bits/stdc++.h>

int dp[101], loc[101], v[101];

int main()
{
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k;
        memset(dp,0,sizeof dp);
        memset(loc,0,sizeof loc);
        memset(v,0,sizeof v);
        scanf("%d%d",&n,&k);
        for(int i = 1; i <= n; ++i)
            scanf("%d",loc+i);
        for(int i = 1; i <= n; ++i)
            scanf("%d",v+i);
        /*init loc[i] value*/
        for(int i = 1; i <= n; ++i)
            dp[i] = v[i];
        //the max value can be obtain end of j
        for(int j = 1; j <= n; ++j){
            for(int d = j+1; d <= n; ++d){
                if(loc[d]-loc[j]>k){
                    dp[d] = std::max(dp[d],dp[j]+v[d]);
                }
            }
        }
        int ans = 0;
        for(int i = 1; i <= n; ++i){
            ans = std::max(dp[i],ans);
        }

        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Eternally831143/article/details/81278287