打卡信奥刷题(2148)用C++信奥 P12214 [蓝桥杯 2023 国 Python B] 贸易航线
·
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-1−1 表示该商品在这个地区无法交易。
输出格式
输出一行包含一个整数表示答案。
输入输出样例 #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 300n≤300,m≤3m \leq 3m≤3,k≤10k \leq 10k≤10;
- 对于 40%40\%40% 的评测用例,n≤2000n \leq 2000n≤2000,m≤4m \leq 4m≤4,k≤50k \leq 50k≤50;
- 对于所有评测用例,1≤n≤1051 \leq n \leq 10^51≤n≤105,1≤m≤101 \leq m \leq 101≤m≤10,1≤k≤1001 \leq k \leq 1001≤k≤100,1≤Pi,j≤1091 \leq P_{i,j} \leq 10^91≤Pi,j≤109。
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++考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容
更多推荐


所有评论(0)