提交时间:2026-01-04 15:38:27
运行 ID: 81082
#include<bits/stdc++.h> // https://www.luogu.com.cn/problem/P1070 // 建议听B站收藏的题解 using namespace std; const int N=1009; int a[N][N]; // 存储i条道路在j时刻出现的金币数 int c[N]; // 存储购买机器人的费用 int dp[N]; // 到第i时刻能获得的最多金币数 int main(){ int n,m,p; cin>>n>>m>>p; for(int i=1;i<=n;++i){ for(int j=1;j<=m;++j){ cin>>a[i][j]; } } for(int i=1;i<=n;++i) cin>>c[i]; memset(dp,-0x3f,sizeof dp); //因为过程中可能出现负值 dp[0]=0; for(int i=1;i<=m;++i){ //枚举时刻 for(int j=1;j<=n;++j){ //枚举购买机器人的工厂 int gain=dp[i-1]-c[j]; //扣除买机器人的钱 for(int k=0;k<p&&k+i<=m;++k){ int pos=j+k; if(pos>n) pos%=n; //判断是否转圈了 gain+=a[pos][i+k]; dp[i+k]=max(dp[i+k],gain); //cout<<"chk1:"<<i<<","<<j<<","<<k<<","<<dp[i+k]<<endl; } } } cout<<dp[m]; return 0; }