【SSL】1558科技庄园
发布日期:2021-05-07 09:19:27 浏览次数:23 分类:精选文章

本文共 1659 字,大约阅读时间需要 5 分钟。

【SSL】1558科技庄园

Time Limit:1000MS

Memory Limit:65536K

Description

Life是河北衡水中学的学生,他是一个道德极高的学生,他积极贯彻党的十七大精神,积极走可持续发展道路,在他的不屑努力下校领导终于决定让他在衡中的一片闲杂地里种桃,以亲身实践种田的乐趣,厉行节约,告诉人们节约的重要性!

春华秋实,在这个金秋的季节,Life带者他的宠物——PFT到了他的试验田,当他看见自己的辛勤成果时,心里是那个高兴啊!
这时Life对他的宠物PFT说:“你想不想吃桃啊?”
PFT兴奋的说:“好啊!”
Life说:“好吧,但是我只给你一定的时间,你必须在规定的时间之内回到我面前,否则你摘的桃都要归我吃!”
PFT思考了一会,最终答应了!
由于PFT的数学不好!它并不知道怎样才能在规定的时间获得最大的价值,但你是一个好心人,如果你帮助它,你的RP一定会暴涨的!
对于这个可以RP暴涨机会,你一定不会错过的是不是?
由于PFT不是机器人,所以他的体力并不是无限的,他不想摘很多的桃以至体力为0,而白白把桃给Life。同时PFT每次只能摘一棵桃树,摘桃花费时间体力,每棵桃树都可以摘K次(对于同一棵桃每次摘的桃数相同)。每次摘完后都要返回出发点(PFT一次拿不了很多)即Life的所在地(0,0){试验田左上角的桃坐标是(1,1)}。
PFT每秒只能移动一个单位,每移动一个单位耗费体力1(摘取不花费时间和体力,但只限上下左右移动)。

Input

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

下面一个N行M列的矩阵桃田。表示每次每棵桃树上能摘的桃数。
接下来N行M列的矩阵,表示每棵桃最多可以采摘的次数K。

Output

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

Sample Input

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次(1,1)或1次(2,3),体力和时间不满足再摘桃了。

Sample Output

10

Hint

对于M N TI A

10<=30%<=50
10<=100%<=100
对于K
10<=100%<=100
保证结果在longint范围内

思路

这道题是。

设f[i]为消耗i的时间和体力所能获得的最大的桃个数。
a为每次每棵桃树上能摘的桃数;
x,y为坐标。
f[i]=max(f[i],f[i-((x+y)<<1)]+a[x][y];
1<=x<=n,1<=y<=m,1<=i<=min(TI,A-1);

代码

#include
#include
#include
using namespace std;int f[1010],a[1010][1010],n,m,v;void input(){ int i,j,t1,t2; memset(f,0,sizeof(f)); scanf("%d%d%d%d",&n,&m,&t1,&t2); v=min(t1,t2-1); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); return;}void DP(){ int i,j,k,l; for(i=1;i<=n;i++) for(j=1;j<=m;j++) for(scanf("%d",&k);k;k--) for(l=v;l>=i+j+i+j;l--) f[l]=max(f[l],f[l-i-j-i-j]+a[i][j]);//状态转移方程 return;}int main(){ input(); DP(); printf("%d",f[v]); return 0;}
上一篇:【SSL】2296对抗赛
下一篇:【SSL】2294打包

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年04月13日 03时41分29秒