P12214 [蓝桥杯 2023 国 Python B] 贸易航线

题目描述

小蓝要带领一支船队依次经过 nnn 个地点。小蓝的船上可以携带 kkk 单位的商品,商品共有 mmm 种,在每个地点的价格各不相同,部分商品在部分地区无法交易。

一开始小蓝的船是空的,小蓝可以在每个地点任意地买入各种商品,然后在之后经过的地点卖出。小蓝的钱很多,你可以认为小蓝买入商品时只会受到船队的容量的限制。

问小蓝到达终点时的最大收益是多少。

输入格式

输入的第一行包含三个整数 n,m,kn, m, kn,m,k,相邻的整数之间使用一个空格分隔。

接下来 nnn 行,每行包含 mmm 个整数,其中第 iii 行的第 jjj 个数 Pi,jP_{i,j}Pi,j 表示在第 iii 个地点第 jjj 种商品的价格。特别地,值为 −1-11 表示该商品在这个地区无法交易。

输出格式

输出一行包含一个整数表示答案。

输入输出样例 #1

输入 #1

7 4 4
1 2 3 6
-1 2 3 4
-1 2 4 4
3 3 2 2
2 5 3 1
1 3 3 2
1 2 4 2

输出 #1

24

说明/提示

评测用例规模与约定

  • 对于 20%20\%20% 的评测用例,n≤300n \leq 300n300m≤3m \leq 3m3k≤10k \leq 10k10
  • 对于 40%40\%40% 的评测用例,n≤2000n \leq 2000n2000m≤4m \leq 4m4k≤50k \leq 50k50
  • 对于所有评测用例,1≤n≤1051 \leq n \leq 10^51n1051≤m≤101 \leq m \leq 101m101≤k≤1001 \leq k \leq 1001k1001≤Pi,j≤1091 \leq P_{i,j} \leq 10^91Pi,j109

C++实现

#include<iostream>
using namespace std;
int n,m,k;
int P[100001][11];
long long dp[100001][11],b[100001][11];
long long dfs(int x,int y){
    if(x>n)return 0;
    if(b[x][y]==1)return dp[x][y];//记忆化
    b[x][y]=1;
    long long ans=0;
    if(y==0){
        for(int i=1;i<=m;i++){
            if(P[x][i]!=-1)ans=max(ans,dfs(x+1,i)-P[x][i]);//买入商品
        }
    }else if(P[x][y]!=-1)ans=dfs(x,0)+P[x][y];//卖出商品+腾出的位置再次买入
    dp[x][y]=max(ans,dfs(x+1,y));//不卖也不买
    return dp[x][y];
}
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)scanf("%d",&P[i][j]);
    }
    printf("%lld",dfs(1,0)*k);
    return 0;
}

在这里插入图片描述

后续:

接下来我会不断用C++来实现信奥比赛中的算法题、C++考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐