题意解析

nn条道路连接这nn个工厂。 mm秒内每秒会刷新s[i][j]s[i][j]个金币。 你可以在第ii个工厂花s1[i]s1[i]个金币买一个机器人,机器人可以走1 p1~p步,拾起沿途的金币,问你最多能有多少金币

思路解析

我们可以用dp的思想简化这个问题,dp[i]dp[i]ii秒内最多能捡多少个金币。 可以枚举每一秒,每一个工厂和走11~pp步的情况

dp[时间]=max(dp[时间],p步的收益+原收益);dp[时间]=max(dp[时间],走p步的收益+原收益);
#include<bits/stdc++.h>
using namespace std;
long long n,m,p,s1[1005][2010],s2[1005],dp[1005];
int main(){
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++)cin>>s1[i][j];//输入第i秒第j条道路的收益
	}
	for(int i=1;i<=n;i++)cin>>s2[i];//输入在i号工厂制造机器人的价格
	for(int i=1;i<=m;i++)dp[i]=-2e9;//设置初始值为负无穷
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			long long res=dp[i-1]-s2[j];
			for(int z=1;z<=p and i+z-1<=m;z++){//累加计算收益
				int a=j+z-1,b=i+z-1;
				a-=((a-1)/n)*n;
				res+=s1[a][b];
				dp[b]=max(dp[b],res);//取最大值
			}
		}
	}
	cout<<dp[m];//输出第m秒的最大收益
}

0 条评论

目前还没有评论...