luogu2760_科技庄园

版权声明:本文为博主原创文章,未经博主允许不得转载,不得用于商业用途。 https://blog.csdn.net/WDAJSNHC/article/details/81590098

luogu2760_科技庄园

时空限制    1000ms/128MB

题目背景

Life种了一块田,里面种了有一些桃树。

Life对PFT说:“我给你一定的时间去摘桃,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”

PFT思考了一会,最终答应了!

由于PFT的数学不好!它并不知道怎样才能在规定的时间获得最大的价值,

由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,,每棵桃树都可以摘K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。

PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。

输入输出格式

输入格式:

第一行:四个数为N,M,TI,A 分别表示试验田的长和宽,Life给PFT的时间,和PFT的体力。

下面一个N行M列的矩阵桃田。表示每次每棵桃树上能摘的桃数。

接下来N行M列的矩阵,表示每棵桃最多可以采摘的次数K。

输出格式:

一个数:PFT可以获得的最大的桃个数。

输入输出样例

输入样例#1:

4 4 13 20
10 0  0  0
0  0  10 0
0  0  10 0
0  0  0  0
1 0 0 0
0 0 2 0
0 0 4 0
0 0 0 0

输出样例#1:

10

说明

样例说明:

可以摘到1次(1,1)和1次(2,3),体力和时间不满足再摘桃了。

范围:

对于M,N,TI,A 10<=30%<=50 10<=100%<=100

对于K 10<=100%<=100

保证结果在long int范围内

代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 105, M = 1000005;
int tree[N][N],k[N][N],pow[M],val[M],f[N];

int main(){
	int n,m,Ti,A,tot=0;
	cin>>n>>m>>Ti>>A;
	for (int i=1; i<=n; i++)	//输入桃树位置
		for (int j=1; j<=m; j++) cin>>tree[i][j];
	for (int i=1; i<=n; i++)
		for (int j=1; j<=m; j++){
			cin>>k[i][j];		//此处桃树采摘次数
			if (tree[i][j]){	//此处有桃树,把二维转换为一维存储
				for (int p=tot+1; p<=tot+k[i][j]; p++){
					pow[p]=2*(i+j);		//可以摘第p个桃子所花费时间和体力
					val[p]=tree[i][j];	//可以摘第P个桃子坐标
				}
				tot += k[i][j];	//可以摘桃子的数目累加 i,j处数量
			}
		}
	for (int i=1; i<=tot; i++)	//看似二维分组,其实是一维,背包为min(Ti,A-1)
		for (int j=min(Ti,A-1); j>=0; j--)
			if (j-pow[i]>=0) f[j]=max(f[j],f[j-pow[i]]+val[i]);
	int ans=0;
	for (int i=1; i<N; i++) ans=max(ans,f[i]);
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/WDAJSNHC/article/details/81590098